Simple async exemple avec tornade python
Je veux trouver simple async exemple de serveur.
J'ai une fonction avec beaucoup d'attente, les transactions de base de données ... etc:
def blocking_task(n):
for i in xrange(n):
print i
sleep(1)
return i
J'ai besoin d'exécuter la fonction dans des processus séparés sans blocage. Est-il possible?
OriginalL'auteur user1941407 | 2014-04-07
Vous devez vous connecter pour publier un commentaire.
Tornade est conçu pour exécuter toutes vos opérations dans un seul thread, mais utiliser les e/S asynchrones, pour éviter de bloquer autant que possible. Si la DB que vous utilisez dispose asychronous bindings Python (idéalement à ceux conçus pour les Tornado plus précisément, comme Moteur pour MongoDB ou momoko pour Postgres), alors vous serez en mesure d'exécuter vos requêtes DB sans bloquer le serveur; pas de processus ou threads nécessaire.
À l'adresse exacte de l'exemple que vous avez donné, où
time.sleep(1)
est appelé, vous pouvez utiliser cette approche pour le faire de manière asynchrone via tornade coroutines:La partie intéressante est
async_sleep
. Cette méthode est la création d'une Tâche asynchrone, qui est l'appel de laioloop.add_timeout
méthode.add_timeout
va lancer un rappel spécifié après un nombre donné de secondes, sans blocage de la ioloop lors de l'attente pour le délai d'expiration. Il attend deux arguments:Comme vous pouvez le voir dans l'exemple ci-dessus, nous ne sommes qu'à réellement fournir un paramètre
add_timeout
explicitement dans le code, ce qui signifie que nous fin de cette présente:Nous ne sommes pas fournir les attendus de rappel paramètre. En fait, quand
gen.Task
exécuteadd_timeout
, il ajoute unecallback
argument mot-clé à la fin de l'fournies explicitement les paramètres. Donc:Résultats de cet être exécuté à l'intérieur d'gen.Tâche():
Quand
gen.Callback
est exécuté après le délai d'attente, il signale que legen.Task
est terminée, et l'exécution du programme va continuer sur la ligne suivante. Ce flux est le genre de difficile à comprendre, au moins dans un premier temps (c'était certainement le cas pour moi quand j'ai lu à ce sujet). Il sera probablement utile de lire sur les Tornade gen documentation du module à quelques reprises.Cette réponse a été écrit avant async/await a été ajouté à Python.
OriginalL'auteur dano
Lorsque vous exécutez le code ci-dessus, vous pouvez exécuter un calcul coûteux à http://127.0.0.1:5000/A , qui ne bloque pas l'exécution, voir en visitant http://127.0.0.1:5000/B immédiatement après que vous visitez http://127.0.0.1:5000/A.
OriginalL'auteur Iaroslav
Ici-je mettre à jour les informations sur la Tornade 5.0. Tornade 5.0 ajouter une nouvelle méthode
IOLoop.run_in_executor
. Dans "l'Appel de fonctions de blocage" de Coroutine modèles Chapitre:Aussi, dans le documeng de
run_on_executor
, est dit:En version 5.0, IOLoop.run_in_executor est recommandé en cas d'utilisation d'Appeler les fonctions de blocage.
OriginalL'auteur Qianyue