gpt4 book ai didi

python - 运行第二个 zmq.eventloop.ioloop

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:11 27 4
gpt4 key购买 nike

我想在后台线程中创建一个 PyZMQ 事件循环,并让它与独立的 Python 脚本和 IPython 脚本一起正常工作。 (IPython 使用位于主线程中的 PyZMQ 事件循环,因此这给我带来了问题,也是为什么我想在后台线程中启动私有(private) 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 对象,但我的私有(private)实例 IOLoop 从不打印 hi。

我可能做错了什么?

最佳答案

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

Note that it is not safe to call add_timeout from other threads. Instead, you must use add_callback to transfer control to the IOLoop's thread, and then call add_timeout from there.

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

关于python - 运行第二个 zmq.eventloop.ioloop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288066/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com