我是 Python 的新手,但我想编写一个用作multiprocessing.QueueGo 通道的多进程程序。但是,似乎并multiprocessing.Queue.put(, block=True)没有像记录的那样阻止。这是我的 Python 示例程序:import multiprocessingimport selectimport timedef 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 mainimport ( "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 回答
临摹微笑
TA贡献1982条经验 获得超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
>>>
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报
0/150
提交
取消