Python Tornado:错误:无法添加/删除句柄-multi_perform()已在运行

Python Tornado:错误:无法添加/删除句柄-multi_perform()已在运行,python,multithreading,python-3.x,tornado,Python,Multithreading,Python 3.x,Tornado,我正在使用Tornado发出一些异步请求,并希望每秒发出一个请求。我是这样做的: from tornado.httpclient import AsyncHTTPClient import tornado.ioloop def repeat(): HTTP_CLIENT.fetch(some_request, handle_response) threading.Timer(1, repeat).start() AsyncHTTPClient.configure(max_cl

我正在使用Tornado发出一些异步请求,并希望每秒发出一个请求。我是这样做的:

from tornado.httpclient import AsyncHTTPClient
import tornado.ioloop

def repeat():
    HTTP_CLIENT.fetch(some_request, handle_response)
    threading.Timer(1, repeat).start()

AsyncHTTPClient.configure(max_clients=100)
HTTP_CLIENT = AsyncHTTPClient()
repeat()
tornado.ioloop.IOLoop.current().start()
这会持续大约一分钟,但随后我出现以下错误:

线程thread-29中的异常:回溯(最后一次调用):

错误:无法添加/删除句柄-multi_perform()已在运行

我知道这是因为IOLoop和AsyncHTTPClient只能从调用IOLoop.start()的线程访问


那么,如何安排repeat()函数始终在调用IOLoop.start()的同一线程上运行呢?

Tornado不是线程安全的,除了。不要在Tornado中使用线程代码计划回调;改为这样做:

def repeat():
    HTTP_CLIENT.fetch(some_request, handle_response)
    tornado.ioloop.IOLoop.current().add_timeout(timedelta(seconds=1), repeat)

谢谢必须运行,但我会稍后检查并接受它,如果它是好的获取此错误:pylint]E0602:未定义的变量'timedelta'只需要
导入datetime
,而且它是
datetime.timedelta
Hi@A.Jesse,非常感谢!我测试了这个,重复调用了一次,而且只有一次。因此,这并不是要安排一个每秒重复一次的通话,而只是一次通话。有没有一种方法可以重复安排回调?我已经更新了我的答案以澄清:从“repeat”函数本身调用“add_timeout”。