运行一段时间后,python中的多进程程序似乎变慢了

时间:2015-04-18 15:06:37

标签: python multithreading multiprocessing

我在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中是否存在关于并行的出生缺陷?

1 个答案:

答案 0 :(得分:2)

我不确定它是真正的原因但是,你从一个越来越长的列表的开头弹出。这很贵。尝试使用collections.deque

更新:阅读链接代码。您应该使用队列,如本文的评论和线程中所建议的那样。 您使用Queue消除了锁定。 工作者是IO绑定的,因此线程是合适的。