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?
Réponses
Trop de publicités?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.
Jetez un oeil ici:
La Programmation asynchrone en Python
Une Introduction à la Programmation Asynchrone et Tordu
La peine de vérifier:
asyncio (précédemment Tulip) a été activée dans la branche par défaut de Python
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.
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.