2017-04-10 23 views
1

我正在使用Tornado進行一些異步請求,並且希望每秒發出一個請求。我這樣做是這樣的:龍捲風:錯誤:無法添加/刪除句柄 - multi_perform()已經在運行

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

這適用於約一分鐘,但後來我得到這個錯誤:

Exception in thread Thread-29: Traceback (most recent call last):
...

error: cannot add/remove handle - multi_perform() already running

我知道,這是一個事實導致了IOLoop和AsyncHTTPClient應只能從調用IOLoop.start()的線程訪問。

那麼如何安排我的repeat()函數總是在調用IOLoop.start()的同一個線程上運行?

回答

2

龍捲風不是線程安全的,除了add_callback。不要使用線程代碼在Tornado中安排回調;取而代之:

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

謝謝!需要運行,但我會稍後檢查並接受它,如果它不錯 – etayluz

+0

獲取此錯誤:pylint] E0602:未定義的變量'timedelta' – etayluz

+0

只需要'import datetime'並且它也是'datetime.timedelta' – etayluz