【问题标题】:running a 2nd zmq.eventloop.ioloop运行第二个 zmq.eventloop.ioloop
【发布时间】:2014-10-10 06:26:53
【问题描述】:

我想在后台线程中创建一个 PyZMQ 事件循环,并让它与独立的 Python 脚本和 IPython 脚本一起正常工作。 (IPython 使用位于主线程中的 PyZMQ 事件循环,所以这给我带来了问题以及为什么我想在后台线程中启动一个私有 ioloop。)

我想在线程 A 中运行代码,同时让 PyZMQ 事件循环处理从线程 B 中的套接字接收数据。在线程 A 中有时我需要等待线程 B 中设置的事件。

我怎样才能让它工作?如果我在 IPython 中尝试似乎有问题:

from zmq.eventloop import ioloop
import threading

class IOBackgroundLoop(object):
    def __init__(self):
        self._loop = None
        self._thread = threading.Thread(target=self.run)        
        self._thread.daemon = True
        self._started = threading.Event()
    @property
    def loop(self):
        return self._loop
    def run(self):
        self._loop = ioloop.IOLoop()
        self._loop.initialize()
        self._loop.make_current()
        self._started.set()
        self._loop.start()
    def start(self):
        self._thread.start()
        self._started.wait()

bkloop = IOBackgroundLoop()
bkloop.start()
for loop in [bkloop.loop, ioloop.IOLoop.instance()]:
    print "%s running: %s" % (loop, loop._running)

这会打印出两个独立的 IOLoop 实例,但如果我使用它,它似乎不起作用。我想不出一个小示例程序来证明这一点;我试过超时功能:

import time

def print_timestamp(key):
    print "%s: %s" % (time.time(), key)

for loop in [bkloop.loop, ioloop.IOLoop.instance()]:
    loop.add_timeout(bkloop.loop.time() + 1.0, lambda: print_timestamp("hi from %s" % loop))
    print_timestamp("here")
    time.sleep(2.0)
    print_timestamp("there")

结果我得到了这个(没有“hi”:

1412889057.68: here
1412889059.68: there
1412889059.68: here
1412889061.68: there

然后当我按下另一个 shift+Enter 时,我得到了

1412889061.68: hi from <zmq.eventloop.ioloop.ZMQIOLoop object at 0x000000000467E4E0>

这是来自主线程的 IOLoop 对象,但我的私有实例 IOLoop 从不打印 hi。

我做错了什么?

【问题讨论】:

    标签: python multithreading python-2.7 zeromq pyzmq


    【解决方案1】:

    啊,我刚刚在 tornado 文档中注意到了这一点:

    请注意,从其他线程调用add_timeout 是不安全的。 相反,您必须使用add_callback 将控制权转移到 IOLoop 的线程,然后从那里调用add_timeout

    似乎zmq.eventloop.zmqstream 需要设置在与 ioloop 相同的线程中才能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 2016-05-24
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多