我是Python的新手,但是我想编写一个使用multiprocessing.Queue
作为Go通道的多进程程序。但是,看来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”。
除了goroutine是绿色线程而不是进程之外,这是我认为几乎等效的Go程序。
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()
不阻止?
答案 0 :(得分:2)
给予队列长度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
>>>