58 votes

la programmation asynchrone en python

Est-il un générique notion de programmation asynchrone en python? Pourrais-je attribuer un rappel à une fonction, de l'exécuter et de le retourner au programme principal courant immédiatement, peu importe combien de temps à l'exécution de cette fonction serait-elle prendre?

59voto

Alex Martelli Points 330805

Ce que vous décrivez (le programme principal flux de reprendre immédiatement si une autre fonction s'exécute) n'est pas ce qui est normalement appelé "asynchrone" (AKA "event-driven") de la programmation, mais plutôt "multitâche" (AKA "multithreading" ou "traitement multiple"). Vous pouvez obtenir ce que vous avez décrit avec la bibliothèque standard les modules d' threading et multiprocessing (ce dernier permet réels de l'exécution en simultané sur multi-core machines).

Asynchrone (event-driven) la programmation est pris en charge dans la bibliothèque standard de Python dans l' asyncore et asynchat modules, qui sont très orienté vers les tâches de mise en réseau (en effet ils utiliser à l'interne de l' select module, qui, sur les vitres, prend en charge uniquement les sockets, quoique à Unixy OSs il peut également soutenir tout descripteur de fichier).

Pour un cadre plus général (bien que la plupart de réseaux orientés, mais pas limité à) l'appui aux asynchrone (event-driven) de la programmation, consultez le tordu logiciel tiers.

39voto

19voto

Ivan Kharlamov Points 1037

Bonne nouvelle tout le monde!

Python 3.4 serait d'inclure la marque de nouvelles ambitieuse programmation asynchrone mise en œuvre!

Il est actuellement appelée tulipe et dispose déjà d'un suivi actif.

Comme décrit dans la PPE 3153: Asynchrone IO soutien et PEP 3156: Asynchrone IO Soutien Redémarré:

Les personnes qui veulent écrire du code asynchrone en Python droit maintenant quelques options:

  • asyncore et asynchat;
  • quelque chose sur mesure, très probablement basé sur la sélection d'un module;
  • à l'aide d'une bibliothèque tierce, telles que des Tordus ou gevent.

Malheureusement, chacune de ces options a ses inconvénients, ce qui PEP tente de répondre.

Malgré le fait d'avoir fait partie de l'Python standard library pour une longue période de temps, le asyncore module souffre de défauts fondamentaux suivante à partir d'une inflexible de l'API qui ne résiste pas à la hauteur des attentes d'un moderne asynchrone module de gestion de réseau.

En outre, son approche est trop simpliste pour offrir aux développeurs tous les outils dont ils ont besoin pour exploiter pleinement le potentiel du réseau asynchrone.

La solution plus populaire maintenant utilisé dans la production implique l'utilisation de bibliothèques tierces. Ces souvent apporter des solutions satisfaisantes, mais il y a un manque de compatibilité entre ces bibliothèques, qui tend à faire des bases de codes très étroitement couplé à la bibliothèque qu'ils utilisent.

Cette absence de portabilité entre les différents asynchrone IO bibliothèques provoque beaucoup de duplication des efforts pour la troisième partie de la bibliothèque de développeurs. Suffisamment puissant abstraction pourrait signifier que le code asynchrone est écrit une fois, mais utilisé partout.

Voici le bref aperçu de ses capacités.

14voto

Jesse Dhillon Points 4136

Les autres répondants sont en vous renvoyant à des Tordus, qui est un excellent et très complet cadre, mais à mon avis il a un très pythonic de conception. Aussi, AFAICT, vous devez utiliser le Tordu boucle principale, qui peut être un problème pour vous si vous êtes déjà à l'aide de quelque chose d'autre qui fournit sa propre boucle.

Voici un exemple artificiel à démontrer à l'aide de l' threading module de:

from threading import Thread

def background_stuff():
  while True:
    print "I am doing some stuff"

t = Thread(target=background_stuff)
t.start()

# Continue doing some other stuff now

Cependant, dans presque tous les cas utile, vous souhaitez communiquer entre les threads. Vous devriez regarder dans les primitives de synchronisation, et de se familiariser avec le concept de simultanéité et les questions connexes.

L' threading module fournit beaucoup de ces primitives pour vous à utiliser, si vous savez comment les utiliser.

3voto

Aiden Bell Points 19856

Vous pouvez bien voulez extraire les Tordus de la bibliothèque pour Python. Ils offrent de nombreux outils utiles.

  1. Un peu d'apprêt
  2. Reporter et les choses Liées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X