为什么 multiprocessing.Queue 有一个小延迟,而(显然)multiprocessing.Pipe 没有?
Why does multiprocessing.Queue have a small delay while (apparently) multiprocessing.Pipe does not?
multiprocessing.Queue
的文档指出,从项目入队到它的 pickled 表示被刷新到底层 Pipe 之间存在一点延迟。显然,尽管您可以将一个项目直接排入 Pipe 中(它没有另外说明并暗示就是这种情况)。
为什么 Pipe 不需要或没有相同的后台线程来进行酸洗?这与与 multiprocessor.SyncManager.Queue
交谈时没有类似延迟的原因相同吗?
(额外的问题:文档中说 "After putting an object on an empty queue there may be an infinitesimal delay ..." 是什么意思?我学过微积分;我知道 infinitesimal 是什么意思,但那个意思不是'似乎不适合这里。所以它在说什么?)
如果写入 Pipe
, 当前 线程 阻塞 直到写入完成。因此没有延迟(或者更确切地说,调用线程无法观察到任何延迟),但是有可能 deadlock; Pipe
是低于 Queue
的工具。
SyncManager.Queue
的情况很简单,所有对管理器的请求都是同步的,这样推送对象的进程就无法观察到它仍然是空的(没有流行音乐)。
同时,“无穷小”延迟仅意味着线程调度延迟,而不是写入整个对象的(可能更大)时间:started 就足够了从而确定 Queue
不为空。推送线程仍然可以赢得比赛并观察它仍然缺少“已推送”的对象。
multiprocessing.Queue
的文档指出,从项目入队到它的 pickled 表示被刷新到底层 Pipe 之间存在一点延迟。显然,尽管您可以将一个项目直接排入 Pipe 中(它没有另外说明并暗示就是这种情况)。
为什么 Pipe 不需要或没有相同的后台线程来进行酸洗?这与与 multiprocessor.SyncManager.Queue
交谈时没有类似延迟的原因相同吗?
(额外的问题:文档中说 "After putting an object on an empty queue there may be an infinitesimal delay ..." 是什么意思?我学过微积分;我知道 infinitesimal 是什么意思,但那个意思不是'似乎不适合这里。所以它在说什么?)
如果写入 Pipe
, 当前 线程 阻塞 直到写入完成。因此没有延迟(或者更确切地说,调用线程无法观察到任何延迟),但是有可能 deadlock; Pipe
是低于 Queue
的工具。
SyncManager.Queue
的情况很简单,所有对管理器的请求都是同步的,这样推送对象的进程就无法观察到它仍然是空的(没有流行音乐)。
同时,“无穷小”延迟仅意味着线程调度延迟,而不是写入整个对象的(可能更大)时间:started 就足够了从而确定 Queue
不为空。推送线程仍然可以赢得比赛并观察它仍然缺少“已推送”的对象。