Python 中的多重锁

问题描述 投票:0回答:1

在我的Python3.12代码中,我有三个线程,其中第一个线程T1是消费者,第二个线程T2是生产者,第三个线程T3是记录器。有一个共享队列,它是临界区,由 T1 和 T2 访问。我正在使用队列锁。

但是,T2 中的三个附加变量 V1、V2 和 V3 由一个函数操作,这些变量也由 T3 中的另一个函数操作。

因此,我最终在 T2 内处理队列的锁和(不确定)3 个变量的锁。

问题是在这种情况下,就锁的数量及其操作而言,正确的方法是什么?换句话说,我是否需要一个或多个锁来处理 3 个变量?

我尝试过使用一把锁,但没有得到预期的结果。

python multithreading python-multithreading
1个回答
0
投票

quamrana 在评论中说,

每个实体有一把锁(您的三个变量可以算作一个实体。)

如何决定,您需要考虑变量之间是否存在某些重要的“关系”。需要更改多个变量的单个线程一次只能更改一个变量。您必须问自己,如果线程 A 在更新某些变量集的过程中被操作系统暂停*,并且线程 B 在 A 暂停时查看这些变量,这会是坏事吗?线程 B 会看到它不应该看到的东西吗?有什么没有意义的事情吗?如果是这样,那么变量集就是 quamrana 所说的那些“实体”之一,并且需要用锁来保护它。 拥有一把锁来保护多个“实体”是可以的。这就是“粗粒度锁定”的本质。如果您不一致地使用锁,则不起作用。我的意思是,假设某个变量

V

属于实体E1任何时候任何线程访问V,你都需要它来锁定L1如果同一个变量V也是某个other实体的成员,E2(不是一个好主意,但它发生了),那么你将需要一个锁,L2其他实体,任何时候你做任何可能改变V,的事情,你都需要锁定两个锁。在我的个人看来,如果你达到了这一点,如果你以“粗略”的方式进行,并使用相同的锁保护两个实体,你会更好。

* “被操作系统暂停”是多线程程序中经常发生的事情(单线程程序中也是如此。)

© www.soinside.com 2019 - 2024. All rights reserved.