首页 > 解决方案 > 为什么 multiprocessing.Queue 有一个小的延迟,而(显然) multiprocessing.Pipe 没有?

问题描述

文档multiprocessing.Queue指出,从一个项目入队到它的腌制表示被刷新到底层管道有一点延迟。显然,尽管您可以将项目直接排入管道(它没有另外说明,并且暗示就是这种情况)。

为什么 Pipe 不需要 - 或拥有 - 相同的后台线程来进行酸洗?这与与 a 交谈时没有类似延迟的原因相同multiprocessor.SyncManager.Queue吗?

(额外的问题:当文档说“将对象放入空队列后,可能会有无穷小的延迟......”时,它是什么意思?我学过微积分;我知道无穷小是什么意思,而那个意思并不似乎适合这里。那它在说什么?)

标签: pythonpython-3.xpython-multiprocessing

解决方案


如果您写入 a Pipe当前线程会阻塞,直到写入完成。因此没有延迟(或者更确切地说,调用线程无法观察到任何延迟),但有可能死锁Pipe是比 更低级别的工具Queue

情况SyncManager.Queue很简单,对管理器的所有请求都是同步的,因此推送对象的进程无法观察到它仍然是空的(没有弹出)。

同时,“无穷小”延迟仅表示线程调度延迟,而不是(可能大得多的)写入整个对象的时间:它已经启动以确定Queue不是空的就足够了。推动线程仍然可以赢得比赛并观察到它仍然缺少“已经推动”的对象。


推荐阅读