【发布时间】: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