IPython - 可以使用Tornado ioloop吗?

时间:2014-08-23 17:06:22

标签: python asynchronous ipython tornado

我正在研究一些需要后台任务在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 个答案:

答案 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()