Python 列表的并行处理
我正试着了解多重处理。我有一个列表,我把它分成两个等长的部分,我把它们分成两个不同的过程。我知道这部分是有效的,因为打印Python 列表的并行处理,python,multiprocessing,Python,Multiprocessing,我正试着了解多重处理。我有一个列表,我把它分成两个等长的部分,我把它们分成两个不同的过程。我知道这部分是有效的,因为打印saveto会给我两个列表。但我无法访问它们,因为最终我得到了两个空列表。为什么我不能访问我想要写入到l1和l2的内容,我该怎么做 import multiprocessing import random def sort(l, saveto): saveto = sorted(l) print saveto if __name__ == '__main_
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
用于在进程之间共享数据
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()
更新:
事实证明,将大量数据放入队列可能会导致死锁。这是:
警告
如上所述,如果子进程已将项目放入队列(和
它没有使用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()
它们似乎不是同时运行的<代码>p2似乎在等待
p1
完成。我如何同时运行它们?它们同时运行。如果您使用print
和time.sleep()
添加到排序函数循环中,您可以看到它。好的,是的,您是对的。但是如果我在queue.put(sorted(l))之后打印“done”,在p1.start()之后打印“p1 start”
,在p2.start()之后打印“p2 start”
我总是得到:p1 start;完成;p2启动;已完成
,因此它最终会按顺序处理。