Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行第二个zmq.eventloop.ioloop_Python_Multithreading_Python 2.7_Zeromq_Pyzmq - Fatal编程技术网

Python 运行第二个zmq.eventloop.ioloop

Python 运行第二个zmq.eventloop.ioloop,python,multithreading,python-2.7,zeromq,pyzmq,Python,Multithreading,Python 2.7,Zeromq,Pyzmq,我想在后台线程中创建一个PyZMQ eventloop,并使它能够与独立的Python脚本和IPython脚本一起正常工作。(IPython使用位于主线程中的PyZMQ EventLoop,因此这给我带来了问题,以及为什么我希望在后台线程中启动私有ioloop。) 我想在线程A中运行代码,同时让PyZMQ eventloop句柄从线程B中的套接字接收数据。在线程A中,有时我需要等待线程B中的事件集 我怎样才能让它工作?如果我在IPython试一试,似乎有点不对劲: from zmq.eventl

我想在后台线程中创建一个PyZMQ eventloop,并使它能够与独立的Python脚本和IPython脚本一起正常工作。(IPython使用位于主线程中的PyZMQ EventLoop,因此这给我带来了问题,以及为什么我希望在后台线程中启动私有ioloop。)

我想在线程A中运行代码,同时让PyZMQ eventloop句柄从线程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")
结果我得到了这个(没有“嗨”:

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

1412889061.68: hi from <zmq.eventloop.ioloop.ZMQIOLoop object at 0x000000000467E4E0>
1412889061.68:hi from
这是主线程中的IOLoop对象,但我的私有实例IOLoop从不打印hi


我可能做错了什么?

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

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

它还显示为需要将
zmq.eventloop.zmqstream
设置在与ioloop相同的线程中才能正常工作

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