gpt4 book ai didi

python - 为什么 Python 的 multiprocessing.Queue 不阻塞

转载 作者:IT王子 更新时间:2023-10-29 02:01:06 30 4
gpt4 key购买 nike

我是 Python 新手,但我想编写一个使用 multiprocessing.Queue 作为 Go channel 的多进程程序。但是,multiprocessing.Queue.put(, block=True) 似乎没有像 documented 那样阻塞.

这是我的 Python 示例程序:

import multiprocessing
import select
import time


def f(q):
while True:
time.sleep(1)
print("Put")
q.put("hello world")


if __name__ == "__main__":
q = multiprocessing.Queue(maxsize=0)
f(q)

我希望它只会打印一个“Put”并永远阻塞。然而,我得到的是它反复打印“Put”。

这是我认为几乎等同的 Go 程序,除了 goroutine 是一个绿色线程而不是进程。

package main

import (
"fmt"
"time"
)

func main() {
ch := make(chan int)
for {
time.Sleep(time.Second)
fmt.Println("Put")
ch <- 1
}
}

当我键入 go run csp.go 时,它只打印一个“Put”,Go 运行时提示程序处于死锁状态。

为什么 multiprocessing.Queue.put() 不阻塞?

最佳答案

给一个队列长度为1,它会按要求阻塞

   Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import multiprocessing
>>> import select
>>> import time
>>>
>>> q = multiprocessing.Queue(maxsize=1)
>>> q.put(9)
>>> q.put(10) // blocking here, have to ctrl-c to escape
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/multiprocessing/queues.py", line 101, in put
if not self._sem.acquire(block, timeout):
KeyboardInterrupt
>>>

关于python - 为什么 Python 的 multiprocessing.Queue 不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53893549/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com