Lock()成为或代理的速度有多快?

时间:2013-02-10 11:53:10

标签: python optimization multiprocessing

问题说明:

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

流程结构如下:

更新进程间共享列表的一个进程。数据更新代码如下:

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中获取不同更新中的信息。

我的问题是,方法获取()和发布()的速度有多快?在我的情况下,它们可以在几秒钟内调用,有时甚至毫秒。 和/或在某种程度上如何避免在我的情况下使用锁?

感谢您的时间。

编辑:在考虑您的评论后,我的问题应该是 - 代理列表如何影响我的计算?我在更新后使用“some_list”和“some_dict”真的很多。

1 个答案:

答案 0 :(得分:1)

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

但后来我花了一些时间来研究你在锁中实际做了什么......基本上只是一些参考作业。它们都没有阻塞,或者做I / O,或者任何“慢”。这只是一些变量分配。所以简短的回答是你获得/释放锁可能是微不足道的。除非你每秒数百次进入几十个线程的锁,否则影响可以忽略不计。但是不要相信我的话 - 去衡量它。

我更担心当lock_xx在锁内更新时,当lock_x和some_dict被锁之外的其他进程引用时会发生什么。