登录
首页 >  Golang >  Go问答

Python的multiprocessing.Queue为何不会导致阻塞

来源:stackoverflow

时间:2024-03-01 21:48:25 497浏览 收藏

本篇文章向大家介绍《Python的multiprocessing.Queue为何不会导致阻塞》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我是python新手,但我想编写一个使用multiprocessing.queue作为go通道的多处理程序。但是,似乎 multiprocessing.queue.put(, block=true) 不会按照记录阻止。

这是我的 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的multiprocessing.Queue为何不会导致阻塞》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>