我在python中编写了一个多处理程序。它可以说明如下:
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中有一个Global Interpreter Lock,所以我改为多处理。但还是有这种现象。完整的代码位于here。我试过Cython,还是有这个现象。我的代码中有什么问题吗?或者python中是否存在关于并行的出生缺陷?
答案 0 :(得分:2)
我不确定它是真正的原因但是,你从一个越来越长的列表的开头弹出。这很贵。尝试使用collections.deque。
更新:阅读链接代码。您应该使用队列,如本文的评论和线程中所建议的那样。 您使用Queue消除了锁定。 工作者是IO绑定的,因此线程是合适的。