2011-09-22 5 views
0

Je dois écrire un tas de tâches où chaque tâche doit interroger un service Web externe. Le service Web répond toujours avec un statut 202 ACCEPTED et pointe dans l'en-tête Location vers l'URI où le résultat peut être interrogé. Le temps nécessaire à ce service Web pour fournir le résultat peut varier de 2 secondes à une minute. Je me demandais quelle était la meilleure approche pour programmer ma tâche de céleri. Pour l'instant j'envoie la demande et commence une boucle while jusqu'à ce que je Pöll avec succès le résultat, par exemple:Attendre le résultat d'un service Web externe dans une tâche

while True: 
    result = poll_webservice() 
    if result: 
     break 
    else: 
     time.sleep(5) 

[ continue with the rest of the task ] 

Bien que cela fonctionne certainement il semble très brut pour moi et aussi je bloquer le travailleur de céleri jusqu'à ce que le résultat est sondé. Y a-t-il une meilleure approche?

+0

si votre appelez un * vrai * webservice, le script ne devrait aller quand il a obtenu une réponse - voir [Plongez dans la page Python SOAP] (http://diveintopython.org/soap_web_services/index.html) pour certains exemples – JMax

+0

@JMax, il existe une possibilité pour quelque chose comme http://docs.picloud.com/rest.html, donc il ne peut pas faire cela. – hymloth

+0

@hymloth: merci de signaler cette URL – JMax

Répondre

1

Vous tuez sûrement vos ressources. Il suffit d'interroger votre service Web externe et enregistrer l'URI à interroger (utiliser un cache ou un db). Ensuite, vous pouvez avoir un periodic task qui recueille les résultats, si prêt ...

0

Je penserais à un céleri tâche qui interroge l'emplacement fourni par la réponse 202. Si elle est complétée, alors elle la traite, sinon elle se re-file elle-même (ou une copie de lui-même) pendant un certain temps plus tard.

Pour les points bonus, si vous avez beaucoup de ces tâches, vous pouvez augmenter le temps entre les sondages chaque fois que la réponse n'est pas prête.

0

Comment utiliser task.retry?

@task(max_retries=100) 
def poll_webservice_task(url): 
    result = poll_webservice(url) 
    if result: 
     return result 
    poll_webservice_task.retry(countdown=5) 
+0

également de ne pas oublier de définir un 'max_retries 'approprié:' @task (max_retries = None) 'sans limite. – asksol

+0

C'est le chemin à parcourir. Je n'étais pas au courant des arguments 'countdown' et' eta' de apply_async. Avec ces arguments et l'utilisation de sous-tâches, je pense que je peux résoudre le problème bien. Merci pour la contribution. –

Questions connexes