首页 > 解决方案 > 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 的调试法则:“行为越怪异,错误就越愚蠢。”

标签: pythonc++socketszeromqpyzmq

解决方案


这显然是 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 的安全更新

推荐阅读