Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Python Multiprocessing - Fatal编程技术网

Python多处理队列行为

Python多处理队列行为,python,python-multiprocessing,Python,Python Multiprocessing,我有以下代码: def f(x, y): def _f(x, y, queue): res = get_data(x, y) queue.put(res) q = Queue() p = Process(target=_f, args=(x, y, q)) p.start() res = q.get() p.join() return res 它工作得很好。但是当我在p.join()之后执行res=q.

我有以下代码:

def f(x, y):
    def _f(x, y, queue):
        res = get_data(x, y)
        queue.put(res)

    q = Queue()
    p = Process(target=_f, args=(x, y, q))
    p.start()
    res = q.get()
    p.join()

    return res
它工作得很好。但是当我在
p.join()
之后执行
res=q.get()
时,像这样:

q = Queue()
p = Process(target=_f, args=(x, y, q))
p.start()
p.join()
return q.get()
对于稍大的数据(例如JSON数组的几百个元素),它将挂起在
p.join()


为什么会这样?

您可能遇到了比赛条件。如果您想查看
多处理.Queue
源代码,您会注意到它使用了
多处理.Pipe
线程.threading
,以便在
多处理.Process
实例之间进行通信。因此,当您调用
Queue.put
时,实际上是在要求前面提到的线程使用
连接将对象写入其他
进程。调用
Queue.get
时,实际上您正在使用通过
Connection.recv
接收的数据,这些数据构成
管道的另一端

现在,如果您深入研究
多处理.Pipe
及其创建的
连接
实例,您会发现它们使用操作系统低级接口来实现大部分功能。但是,通过使用此类接口,编写器必须遵守向
连接提供的数据量上限。发送
,而无需另一个
进程
线程
调用相应的
连接。recv

在您的特定情况下,
\u f
过程在
队列中结束。put(res)
返回(即,在您“请求”
线程
写入
res
之后)。唯一阻止
进程完成的是挂起的
连接;在那之后,它就可以自由行动了。如果对象很小并且遵守操作系统限制,
Conneciton.send
将立即返回,整个过程将完成。另一方面,如果对象大于操作系统限制,
Connection.send
将阻止等待
Connection.recv
为剩余数据释放一些空间。但是,这永远不会发生,因为在调用
进程.start
之后,您调用了
进程.join
,它将一直阻止,直到
进程
结束;只有在调用
Connection.recv
后才会出现的结束;只有在
Process.join
返回后才会发生的调用;我们关闭了我们的死锁链