2010-07-11 14 views
49

Esiste una nozione generica di programmazione asincrona in python? Posso assegnare un callback a una funzione, eseguirlo e tornare immediatamente al flusso del programma principale, indipendentemente dalla durata dell'esecuzione di tale funzione?programmazione asincrona in python

+1

correlati http://nichol.as/asynchronous-servers-in-python – jfs

+2

Ci sono molti interessanti [nuovi sviluppi nel campo] (http://stackoverflow.com/questions/3221314/asynchronous-programming-in- python/18099524 # risposta-18099524). –

risposta

55

Ciò che si descrive (il flusso del programma principale di riprendere immediatamente, mentre un'altra funzione esegue) non è ciò che è normalmente chiamato "asincrono" (AKA "event-driven") di programmazione, ma piuttosto "multitasking" (AKA "multithreading" o "multiprocessing"). È possibile ottenere ciò che è stato descritto con i moduli di libreria standard threading e multiprocessing (quest'ultimo consente l'effettiva esecuzione concomitante su macchine multi-core).

asincrono di programmazione (event-driven) è supportato nella libreria standard di Python nelle asyncore e asynchat moduli, che sono molto orientate al networking compiti (anzi usano internamente il modulo select, che, su Windows, supporta solo i socket - - anche se su sistemi operativi Unixy può supportare qualsiasi descrittore di file).

Per una più generale (ma anche per lo networking orientata, ma non limitati a quella) sostegno asincrono programmazione (event-driven), controllare il pacchetto twisted terze parti.

+5

+1, nessun altro ha notato che stava pensando al threading/forking. –

13

Gli altri intervistati ti indicano Twisted, che è una struttura grande e molto completa, ma a mio parere ha un design molto poco pignone. Inoltre, AFAICT, devi utilizzare il loop principale Twisted, che potrebbe essere un problema per te se stai già utilizzando qualcos'altro che fornisce il proprio loop.

Ecco un esempio inventato che dimostrerebbe utilizzando il modulo threading:

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 

Tuttavia, in quasi tutti i casi utile, si vuole comunicare tra i thread. Dovresti esaminare synchronization primitives e acquisire familiarità con il concetto di concurrency e i problemi correlati.

Il modulo threading fornisce molte primitive di questo tipo da utilizzare, se si sa come utilizzarle.

+0

Mentre multiprocessing (e multithreading) è utile, ciò non significa che sia una soluzione per tutto, né significa che è sempre un buon sostituto per la programmazione basata sugli eventi usando un loop principale. –

19

Buone notizie a tutti!

Python 3.4 includerebbe la nuova programmazione ambiziosa asincrona implementation!

Attualmente è chiamato tulip e ha già un active following.

Come descritto nel PEP 3153: Asynchronous IO support e PEP 3156: Asynchronous IO Support Rebooted:

persone che vogliono scrivere codice asincrono in Python in questo momento hanno un paio di opzioni:

  • asyncore e asynchat;
  • qualcosa su misura, molto probabilmente basato sul modulo selezionato;
  • utilizzando una libreria di terze parti, ad esempio Twisted o gevent.

Sfortunatamente, ognuna di queste opzioni ha i suoi lati negativi, che questo PEP tenta di risolvere.

Nonostante abbia fatto parte della libreria standard Python per un lungo periodo di tempo, il modulo asyncore soffre di difetti fondamentali derivanti da un'inflessibile API che non regge le aspettative di un moderno modulo di rete asincrono.

Inoltre, il suo approccio è troppo semplicistico per fornire agli sviluppatori tutti gli strumenti necessari per sfruttare appieno il potenziale della rete asincrona.

La soluzione più popolare attualmente utilizzata nella produzione prevede l'uso di librerie di terze parti. Questi forniscono spesso soluzioni soddisfacenti, ma c'è una mancanza di compatibilità tra queste librerie, che tende a rendere le codebase molto strettamente collegate alla libreria che usano.

Questa attuale mancanza di portabilità tra diverse librerie di IO asincrone causa un sacco di sforzi duplicati per gli sviluppatori di librerie di terze parti. Un'astrazione sufficientemente potente potrebbe significare che il codice asincrono viene scritto una sola volta, ma usato ovunque.

Questa è la brief overview delle sue abilità.

+0

Sembra strano che qualcuno voglia davvero implementare un modo utile per eseguire la programmazione asincrona in Python. –

+0

@ PavelŠimerda: perché? – MestreLion

+0

@MestreLion: quest'area è stata ignorata per così tanto tempo. –