python - 为什么 multiprocessing.Queue 有一个小的延迟,而(显然) multiprocessing.Pipe 没有?
问题描述
文档multiprocessing.Queue
指出,从一个项目入队到它的腌制表示被刷新到底层管道有一点延迟。显然,尽管您可以将项目直接排入管道(它没有另外说明,并且暗示就是这种情况)。
为什么 Pipe 不需要 - 或拥有 - 相同的后台线程来进行酸洗?这与与 a 交谈时没有类似延迟的原因相同multiprocessor.SyncManager.Queue
吗?
(额外的问题:当文档说“将对象放入空队列后,可能会有无穷小的延迟......”时,它是什么意思?我学过微积分;我知道无穷小是什么意思,而那个意思并不似乎适合这里。那它在说什么?)
解决方案
如果您写入 a Pipe
,当前线程会阻塞,直到写入完成。因此没有延迟(或者更确切地说,调用线程无法观察到任何延迟),但有可能死锁;Pipe
是比 更低级别的工具Queue
。
情况SyncManager.Queue
很简单,对管理器的所有请求都是同步的,因此推送对象的进程无法观察到它仍然是空的(没有弹出)。
同时,“无穷小”延迟仅表示线程调度延迟,而不是(可能大得多的)写入整个对象的时间:它已经启动以确定Queue
不是空的就足够了。推动线程仍然可以赢得比赛并观察到它仍然缺少“已经推动”的对象。
推荐阅读
- flutter - 可滚动屏幕 - Flutter
- python - OpenCV Python-过滤矩形以找到微型汽车的道路中心线
- javascript - ajax 没有获取会话
- php - Laravel 验证 - 不同的数组字段不起作用
- django - Django 模型字段未显示在管理页面中
- firebase - Firebase 模拟器:datasnapshot.ref 抛出“无法解析 Firebase url ...”
- python - 根据索引列表从 numpy 数组中获取和替换值
- excel - 创建数据透视表
- python - Python 3.7 在类型注释上抛出 NameError 但我不想导入定义它的模块
- ios - SwiftUI Preview Canvas 与核心数据一起崩溃