Python Tornado:错误:无法添加/删除句柄-multi_perform()已在运行
我正在使用Tornado发出一些异步请求,并希望每秒发出一个请求。我是这样做的: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
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”。