python 中的多进程程序似乎在 运行 一段时间后变慢了
the multiprocess program in python seems get slowly after run for a while
我在 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,所以我改成multiprocessing。但是还是有这种现象。完整代码在here中。我试过Cython,还是有这个现象。我的代码有问题吗?还是水货python先天缺陷?
我不确定这是真正的原因,但是,您是从一个越来越长的列表的开头弹出的。这太贵了。尝试使用 collections.deque.
更新:阅读链接代码。您应该使用队列,正如对此 post 和线程的评论中所建议的那样。
您使用队列消除了锁。
工作人员受 IO 限制,因此线程是合适的。
我在 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,所以我改成multiprocessing。但是还是有这种现象。完整代码在here中。我试过Cython,还是有这个现象。我的代码有问题吗?还是水货python先天缺陷?
我不确定这是真正的原因,但是,您是从一个越来越长的列表的开头弹出的。这太贵了。尝试使用 collections.deque.
更新:阅读链接代码。您应该使用队列,正如对此 post 和线程的评论中所建议的那样。 您使用队列消除了锁。 工作人员受 IO 限制,因此线程是合适的。