IPython - 是否可以使用Tornado的ioloop?

1 投票
1 回答
1957 浏览
提问于 2025-04-18 18:17

我正在写一些代码,需要在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()

撰写回答