1

问题规范:

我在 python 中运行一些复杂的任务并加快速度,我决定使用 pythons 多处理库。它工作得很好,但过了一段时间我开始想知道,我使用的锁有多少时间,消耗了多少时间,以及进程相互阻塞了多少。

进程结构如下:

一个更新进程之间共享列表的进程。数据更新代码是这样的:

lock.acquire()
list_rex[0] = pat.some_list
list_rex[1] = pat.some_dictionary
lock.release()

其中 list_rex 和 lock 定义为

list_rex = manager.list([[some_elements], {some_elements}])
lock = multi.Lock()

然后有几个进程,偶尔会用这些列表更新自己的内存空间。代码如下:

lock.acquire()
some_list = list_rex[0]
some_dict = list_rex[1]
lock.release()

some_list 和 some_dict 在某种程度上是相关的,所以我不能允许进程在 some_list 中获取来自不同更新的信息,而不是在 some_dict 中。

我的问题是,acquire() 和 release() 方法的速度有多快?就我而言,它们可以在几秒钟内甚至几毫秒内被调用。和/或有什么方法可以避免在我的情况下使用锁?

感谢您的时间。

编辑:在考虑您的评论后,我的问题可能应该是 - 代理列表如何影响我的计算?我在更新后使用“some_list”和“some_dict”确实有很多需要阅读的地方。

4

1 回答 1

1

我正要写一个非常复杂的答案,涉及读写器锁,如果您只是将一个对象同时用于列表和字典,则不需要锁的原子引用分配,以及其他一些关于在更改任何内容之前测量性能的东西......

但是后来我花了一些时间来看看你在锁中实际在做什么......基本上无非是几个参考任务。两者都没有阻塞,或者做 I/O,或者任何“慢”。这只是几个变量赋值。因此,简短的回答是您对锁的获取/释放可能可以忽略不计。除非您每秒数百次跨数十个线程进入锁,否则影响可以忽略不计。但不要相信我的话——去测量它。

我更关心当 some_list 和 some_dict 被锁外的其他进程引用而 list_rex 在锁内更新时会发生什么。

于 2013-02-10T12:15:49.313 回答