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
risposta
dare uno sguardo qui:
Asynchronous Programming in Python
An Introduction to Asynchronous Programming and Twisted
Worth check-out:
asyncio (previously Tulip) has been checked into the Python default branch
Questa non è davvero una risposta. –
si potrebbe desiderare di checkout biblioteca ritorto per Python. Forniscono molti strumenti utili.
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.
+1, nessun altro ha notato che stava pensando al threading/forking. –
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.
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. –
Si può vedere il mio strumento di programmazione Python asincrona: http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html
import time, random, sys from delegate import * def proc(a): time.sleep(random.random()) return str(a) def proc_callback(handle, args=None): ret = d.end(handle) d = Delegate() d.init(2) # number of workers handle = d.begin(proc, '12345', proc_callback, 'test') sys.stdin.readline() d.free()
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à.
Sembra strano che qualcuno voglia davvero implementare un modo utile per eseguire la programmazione asincrona in Python. –
@ PavelŠimerda: perché? – MestreLion
@MestreLion: quest'area è stata ignorata per così tanto tempo. –
correlati http://nichol.as/asynchronous-servers-in-python – jfs
Ci sono molti interessanti [nuovi sviluppi nel campo] (http://stackoverflow.com/questions/3221314/asynchronous-programming-in- python/18099524 # risposta-18099524). –