2011-11-21 3 views
0

J'ai expérimenté différentes approches et je voudrais voir ce que vous pensiez être la meilleure approche pour résoudre ce problème en Python.Exécution d'une série de fonctions en parallèle pour répondre à une requête HTTP

Fondamentalement, j'ai un service Web qui accepte des requêtes à condition d'un terme de requête unique et procède à effectuer une série de calculs, en parallèle, avec ce terme. Ces calculs peuvent être considérés comme des appels de fonction individuels.

L'idée étant que, dès que la demande arrive, j'appelle les fonctions de manière asynchrone, et maintenez la demande jusqu'à ce que les résultats commencent à arriver.

D'après mes recherches, il semble que l'aide d'une bibliothèque comme gevent est Probablement la meilleure façon de faire, même si je ne suis pas encore tout à fait familier avec les greenlets. Aussi, il me semble que pour accomplir le type de fonctionnalité que je recherche (pour que les résultats soient renvoyés au client via la longue requête dès qu'ils sont disponibles), je dois utiliser un type spécial de StreamServer qui supporte cela. La réponse elle-même est juste des objets JSON à lire par un module JavaScript dans le frontend, qui à son tour va mettre à jour un composant de l'interface utilisateur comme ceux-ci sont renvoyés au navigateur.

Quelle est la meilleure approche pour ce faire? Est-il sensé d'utiliser quelque chose comme gevent ou devrait-il être mis en place en utilisant des co-routines sans l'aide d'une bibliothèque? Je suis sûr que c'est quelque chose qui a été fait beaucoup par le passé par beaucoup de gens ici et je voulais rassembler quelques recommandations.

Merci beaucoup d'avance, faites-moi savoir si vous souhaitez plus de détails, et j'ai hâte d'entendre parler de vos suggestions!

+0

Quelle est la question? –

+0

La question serait, quelle est la meilleure approche pour le faire? Est-il sensé d'utiliser quelque chose comme gevent ou devrait-il être implémenté à l'aide de coroutines sans l'aide d'une bibliothèque? Je suis sûr que c'est quelque chose qui a été fait beaucoup par le passé par beaucoup de gens ici et je voulais rassembler quelques recommandations. –

Répondre

0

En supposant que les "calculs" dont vous parlez ne sont pas liés au processeur, gevent serait génial pour ce genre de chose. Votre gestionnaire de requêtes pourrait ressembler à ceci:

def handle_request(request): 
    ... 
    pool = gevent.pool.Group() 
    results = group.map(do_computation, input_data) 
    return results 

S'ils sont liés CPU, cependant, vous aurez besoin de considérer multiprocessing, comme Python est assez pauvre général en ce qui concerne les tâches CPU lié à seule exploitation processus du système.

Questions connexes