并行处理列表

时间:2016-08-11 00:33:56

标签: python multiprocessing

我正试图解决多处理问题。我有一个列表,我将它分成两个相同长的部分,我将它们分成两个独立的过程。我知道这部分有效,因为打印saveto给了我两个列表。但我无法访问它们,因为最后我得到两个空列表。为什么我无法访问我想要写入l1l2的内容,我该怎么做?

import multiprocessing
import random


def sort(l, saveto):
    saveto = sorted(l)
    print saveto

if __name__ == '__main__':

    l = [int(100000*random.random()) for i in xrange(10000)]

    listlen = len(l)
    halflist = listlen/2
    l1 = []
    l2 = []

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], l1))
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], l2))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print l1
    print l2

1 个答案:

答案 0 :(得分:2)

使用multiprocessing.Queue在流程之间共享数据

import multiprocessing
import random

def sort(l, queue):
    queue.put(sorted(l))


if __name__ == '__main__':
    l = [int(100000*random.random()) for i in xrange(10000)]

    listlen = len(l)
    halflist = listlen/2
    queue = multiprocessing.Queue()

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], queue))
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], queue))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print queue.get()
    print queue.get()

<强>更新

事实证明,将大量数据放入Queue会导致死锁。这是mentioned in the docs

  

警告

     

如上所述,如果子进程已将项目放入队列(和   它没有使用JoinableQueue.cancel_join_thread),然后是那个过程   直到所有缓冲的项目都被刷新为止后才会终止   管。

     

这意味着如果您尝试加入该过程,您可能会陷入僵局   除非您确定所有已放入队列的项目   已被消耗。同样,如果子进程是非守护进程的   然后父进程在尝试加入所有进程时可能会在退出时挂起   非守护儿童。

     

请注意,使用管理器创建的队列没有此问题。

修正版:

import multiprocessing
import random

def sort(l, queue):
    queue.put(sorted(l))


if __name__ == '__main__':
    l = [int(100000*random.random()) for i in range(10000)]

    listlen = len(l)
    halflist = listlen/2

    manager = multiprocessing.Manager()
    queue = manager.Queue()

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], queue))
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], queue))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print queue.get()
    print queue.get()