2017-04-10 4 views
1

私はTornadoを使用して非同期要求をいくつか行い、1秒ごとに要求します。私はそのようなようにやっている:竜巻:エラー:ハンドルを追加/削除できません - 既に実行中の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() 

これは、約1分間動作しますが、その後、私はこのエラーを取得する:

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

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

私はIOLoopとAsyncHTTPClientがすべきこと、これが事実から生じていることを知っていますIOLoop.start()が呼び出されたスレッドからのみアクセスできます。

したがって、IOLoop.start()が呼び出された同じスレッドで常にrepeat()関数が実行されるようにスケジュールするにはどうすればよいですか?

答えて

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

'datetime'をインポートし、' datetime.timedelta'を呼び出すだけです – etayluz

関連する問題