我正在编写一些需要在 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 来实现此目的吗?
最佳答案
这样做的问题是 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()
关于python - IPython - 是否可以使用 Tornado ioloop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25464364/