IPython - 是否可以使用Tornado的ioloop?
我正在写一些代码,需要在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来实现这个吗?
1 个回答
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()