我正在研究一些需要后台任务在IPython中异步运行的代码。为了在后台运行任务,我想我可以使用IPython使用的相同Tornado ioloop。有没有办法获得当前ioloop实例的句柄,并添加回调?
从最简单的意义上讲,我想在后台运行类似f()
的函数:
from tornado import ioloop
import datetime
def f():
print "Hi!"
i= ioloop.IOLoop.instance()
dt = datetime.timedelta(seconds=4)
ioloop.PeriodicCallback(f, 2000).start()
i.start()
然而,当我从IPython加载此文件tornado_test.py
时,我无法在打印时同时输入命令:
In [1]: import tornado_test
Hi!
Hi!
我可以使用IPython ioloop吗?
答案 0 :(得分:1)
执行此操作的问题是i.start()
调用阻止。 Tornado是一个单线程框架;您只能通过在事件循环中实际运行代码来获得异步行为。因此,当事件循环在主线程中运行时,唯一可以运行的代码就是在循环内调度的内容。
但是,您可以通过在后台线程中运行i.start()
命令来获得所需的行为,如下所示:
from tornado import ioloop
import datetime
def f():
print "Hi!"
i= ioloop.IOLoop.instance()
dt = datetime.timedelta(seconds=4)
ioloop.PeriodicCallback(f, 2000).start()
t = threading.Thread(target=i.start)
t.start()