python - ZMQ 上下文套接字在新计算机上的创建速度要慢得多
问题描述
这最初出现在 Python 中,但后来在 C++ 中被复制。这是在我的新笔记本电脑上提炼并复制行为的单元测试。这些只是本地套接字连接。
def test_zmq_publisher_duration(self):
max_duration = 1.0
t0 = time.time()
socket = zmq.Context.instance().socket(zmq.PUB)
duration = time.time() - t0
print(socket)
self.assertLess(duration, max_duration, msg="socket() took too long.")
在其他计算机上,在我的旧笔记本电脑上,这只需几分之一秒。但是,在我的新笔记本电脑(强劲的戴尔 Precision 7730)上,这大约需要44 秒。创建 zmq.SUB(订阅者)套接字时,我得到了类似的结果。
如果我进入 socket() 调用,则一直消耗的两个语句如下:
zmq/sugar/context.py
class Context
def instance(cls, io_threads=1):
...
cls._instance = cls(io_threads=io_threads)
...
def socket(self, socket_type, **kwargs)
...
s = self._socket_class(self, socket_type, **kwargs)
...
我感到困惑和困惑。笔记本电脑上的其他一切似乎都很好。也许我已经pip以某种稍微不同的方式安装了我的依赖模块?以前安装的 zmq 模块与 pyzmq 会导致问题吗?也许是我们 IT 部门的笔记本电脑设置中的一些东西?我尝试过以管理员身份运行、在 PyCharm 中运行、从命令行运行以及在运行时拔下网线。
我对 Python 和 ZMQ 比较陌生,但我们已经在这个项目上开发了几个月,没有出现性能问题。在生产代码中,我们有一个 MessageBroker 类,其中包含大部分 pub/sub 架构。上面的单元测试是通过简单地从我们的 MessageBroker.Publisher 构造函数(它创建套接字)中拉出第一行重要的代码来创建的。即使在这台计算机上创建套接字很慢,我们的应用程序仍然会在创建套接字后正常运行。启动应用程序只需 7 分钟。
我怀疑 Ed 的调试法则:“行为越怪异,错误就越愚蠢。”
解决方案
这显然是 Windows 10 或笔记本电脑固件问题。IT部门推送了一些更新,第二天一切正常。以下是每个事件查看器安装的项目:
- 已安装 KB4456655:Windows 10 版本 1803 的服务堆栈更新:2018 年 9 月 11 日(稳定性改进)
- 已安装 KB4462930:Adobe Flash Player 更新
- 已安装 KB4100347:英特尔微码更新
- 已安装 KB4485449:Windows 10 v1803 的服务堆栈更新 - 2 月 12 日
- 安装的 KB4487017:(与 KB4485449 相同的描述)
- 已安装 KB4487038:Adobe Flash Player 的安全更新
推荐阅读
- sql - 两个表的联合并比较第三个表的重复项?
- java - 如何将列表数据变量传递给存储过程并执行存储过程?
- node.js - NodeJS模块中数据文件的相对路径
- flutter - 为什么未显式设置 bloc 时从未调用 BlocBuilder
- swift - 如何优雅地处理 AVCaptureDeviceInput.init 中的拒绝授权?
- php - 如何将错误的 url 重定向到错误页面
- regex - 正则表达式匹配不包含特定字符或多个字符的字符串
- r - 函数内的 R 全局变量引用/定义
- django - 如何加入 2 个属性以在 Django 模型实例中创建名称?
- rxjs - 订阅 Observable 时结合 take(1) 和 defaultIfEmpty 是否安全/可以
?