2017-04-10 2 views
1

J'utilise Tornado pour effectuer des requêtes asynchrones et je souhaite effectuer une requête chaque seconde. Je le fais en tant que tel:Tornade: erreur: impossible d'ajouter/supprimer handle - multi_perform() déjà en cours d'exécution

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

Cela fonctionne pendant environ une minute mais je reçois cette erreur:

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

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

Je sais que cela se traduit par le fait que le IOLoop et AsyncHTTPClient devrait n'est accessible qu'à partir du thread où IOLoop.start() est appelé.

Alors, comment programmer ma fonction repeat() pour qu'elle s'exécute toujours sur le même thread où IOLoop.start() est appelé?

Répondre

2

Tornado n'est pas thread-safe, à l'exception de add_callback. N'utilisez pas de code de threading pour programmer un rappel dans Tornado; Pour ce faire:

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

Merci! Je dois courir mais je vais vérifier cela plus tard et l'accepter si c'est bon – etayluz

+0

Obtenir cette erreur: pylint] E0602: Variable indéfinie 'timedelta' – etayluz

+0

Juste besoin de 'importer datetime' et c'est aussi' datetime.timedelta' – etayluz