Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表的并行处理_Python_Multiprocessing - Fatal编程技术网

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启动;已完成
,因此它最终会按顺序处理。