the multiprocess program in python seems get slowly after run for a while
我用python编写了一个多处理程序。可以说明如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| nodes = multiprocessing.Manager().list()
lock = multiprocess.Lock()
def get_elems(node):
#get elements by send requests
def worker():
lock.acquire()
node = nodes.pop(0)
lock.release()
elems = get_elems(node)
lock.acquire()
for elem in elems:
nodes.append(node)
lock.release()
if __name__ =="__main__":
node = {"name":"name","group":0}
nodes.append(node)
processes = [None for i in xrange(10)]
for i in xrange(10):
processes[i] = multiprocessing.Process(target=worker)
processes[i].start()
for i in xrange(10):
processes[i].join() |
在程序运行的开始,似乎一切都正常。跑了一段时间后。程序速度减慢。使用多线程时也存在这种现象。我看到在python中有一个全局解释器锁,所以我改为多处理。但还是有这种现象。完整的代码在这里。我试过赛通,还有这个现象。我的代码有问题吗?或者在python中是否存在并行的出生缺陷?
- 在我看来,太多的锁操作肯定会降低代码的速度。使用全局变量也不是很好。
- 什么操作系统?
- 如果处理器之间的进程间开销很高,那么多处理并不能提供令人满意的结果。循环是花费大部分计算时间的地方。尽量选择那些区域。还有,你为什么不试试管道内衬呢?
- 对不起,我的无知,请问你是在工作吗?它不需要一个不可重复的吗?如果我理解您的代码(即,您正尝试元素按原样添加到列表中,而不是作为新列表添加),那么您可能需要EDOCX1 1 1 123081 1 1 12309;。
- 也许,您可能希望更正EDOCX1 1 123080 12309993;使用edoc1 123083;1230c30c1 1 1 1 1 1 1 1 1 1 1 1 1?我是Bettin Gon,这是一个帖子,作为答案…
- @Mark Tolonen在CentOS 6.5 x86 64核上运行此脚本
- @你能举一个如何使用管道衬里的例子吗?
- @Pynchia我想在EDOCX1 123084 12309;中附加一些满足某些条件的节点。我已经编辑了代码。抱歉误导了你。
我不确定这是真正的原因,但是,你正从一个越来越长的列表开始。那太贵了。尝试使用collections.deque。
更新:读取链接的代码。您应该使用一个队列,如本文注释和线程中建议的那样。使用队列可以消除锁。工作线程是IO绑定的,因此线程是适当的。
- instead of collections.deque,which is multiprocessing尝试。没有安全,多进程,你不需要知道most of the锁定了。
- FIFO undeniably for a,这是更好的。我不知道为什么他使用列表…我也在工作,也的确与线程和not only as IPC和经理不有一个deque的。
- 你可以创建自定义的"哈维尔在Managerthat if the exposes deque问题真的电话,换一个。see this答案
- 啊,使用代理模式。好问题!谢谢@丹!
- "哈维尔,你应该使用多线程和队列的意思吗?
- As You see the @哈维尔在联尾,有三股之间的变量的过程。每个过程nodeswrite to need,links(append和tasksto them),每一个过程和tasks(need to read from流行from)。改变tasksto the multiprocessing.Queue()和nodes和linksto the multiprocessing.Manager().list()仍。变量之间的关系links茶叶店nodewhich the指数代表的模式。我不能在没有get the index of元,这就是为什么我使用instead of的答案列表。改进后的性能变化is the,but我慢下来。
- 我想也许在时间成本of the which is to the list append increasingly周名单
- (1)appending meaning is或固定成本,它已经在列表中搜索,but is(nodes.index(node))或(n),这是与linearly’的意义更多的大小。你可以改变的节点到节点的to be with the key and the value as the as the ID,if needed?
- "哈维尔the append时将把更多的increasingly when the list。的焦点,也nodes.index(node)在线。我想这也if tmpu in nodes在线时间成本。和find this and this。什么是你的意见fastest about the Way to check list if contains a specify元?
- appending Down to the list的size不与。EN by changing the initial size measure(1000):python2 -m timeit -s 'a=range(1000)' 'a.append(10)'
- the best is not to list的使用方式,使用字典!如果你必须使用在列表,然后使用二进制搜索和排序/ / / /问题:stackoverflow.com 212358二进制搜索在其他Python will be或EN -(n)的。