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