2015-01-02 9 views
17

TLDR: Sto cercando una spiegazione completa o autorevole (tutorial/libro/presentazione/...) di asyncio per gli sviluppatori di applicazioni.risorse per l'apprendimento/comprensione di asyncio di Python

Mentre conosco bene i loop di eventi e i futures/posticipi/promesse (in gran parte grazie a JavaScript), in qualche modo le complessità dell'asyncio di Python continuano a confondermi. asyncio sembra molto più complesso di quello a cui sono abituato - presumibilmente perché è stato parzialmente progettato per la compatibilità a basso livello con le implementazioni esistenti (Twisted, Tornado ecc.) e perché consente più loop di eventi in thread separati.

Per quanto posso dire, non c'è nessuna procedura dettagliata completa dei concetti di base, così ho consultato il official docs così come vari articles e presentations tutto il web.

Tuttavia, rimango incerto sulla mia comprensione, molto probabilmente perché non è sempre chiaro ciò che è rilevante a livello di applicazione o se non è necessario preoccuparsi delle alternative di cui sopra. (Molte risorse sembrano assumere la familiarità con Twisted et al.)

Alcuni esempi di cose che hanno indotto l'incertezza per me:

  • Finora ho usato solo in combinazione con asyncio.coroutineyield from, ma this comparison suggerisce Dovrei riconsiderare.
  • Un server può essere sia creata usando loop.create_server(MyProtocol) o asyncio.start_server(my_connection_handler) - quando vorrei utilizzare?
  • Qual è la corretta igiene nella gestione del ciclo di vita loop (ad esempio loop.close() dopo loop.run_forever())?
  • devo ancora capire perché Task s sono necessari in aggiunta a Future s.
  • Cosa succede se un costruttore di classi non è bloccante (ad esempio, utilizzare yield from, che sembra non essere valido)?
  • Può getter classe essere asincrona (cioè dell'incontro fra @property e asyncio.coroutine)?
  • Come faccio a sapere se una determinata funzione è asincrona? Ad esempio, mi aspetterei che StreamWriter.write non blocchi, ma non so se sia effettivamente così.

Non sto chiedendo risposte a queste domande particolari, non fanno che illustrano come sto lottando a livello concettuale.

+0

Se ti stai chiedendo per il libro o tutorial io non posso aiutarti. Ma posso rispondere a qualche domanda particolare su asyncio. –

+0

Grazie. In questo momento, non sono sicuro che abbia senso trasformare le precedenti in singole domande, in quanto ciò non aiuterebbe la mia comprensione a livello concettuale. Forse lo sto pensando troppo, quindi lo prenderò in considerazione. – AnC

risposta

2

Io sono come te, in cerca di risposte, ma posso aiutare a withone cosa:

Per quanto riguarda il problema della non-blocking:

ho creato un programma che utilizza i cicli asincroni per ascoltare Twitter feed,

ho trovato la risposta qui: asyncio yield from concurrent.futures.Future of an Executor

In sostanza, utilizzando l'esecutore, è possibile effettuare qualsiasi operazione non bloccante. Solo un avvertimento, i miei compiti sono indipendenti e non hanno bisogno di sincronizzazione, ho solo bisogno che diventino non bloccanti.Se avete bisogno di aspettare per ogni toher, youhave per usare semaforo

Here OS come ho fatto:

@asyncio.coroutine 
def boucle_deux(): 
#faire attendre la boucle si pas bcp de mots 
    while True: 
     print("debut du deux") 
     value = t.next() 
     future2 = loop.run_in_executor(None, mention, "LQNyL2xvt9OQMvje7jryaHkN8", 
             "IRJX6S17K44t8oiVGCjrj6XCVKqGSX9ClfpGpfC467rajqePGb", 
             "2693346740-km3Ufby8r9BbYpyzcqwiHhss22h4YkmnPN4LnLM", 
             "53R8GAAncFJ1aHA1yJe1OICfjqUbqwcMR38wSqvbzsQMB", 23, value) 
     response2 = yield from future2 
     yield from asyncio.sleep(5) 
     print("fin du deux") 

asyncio.Task(boucle_deux()) 

Qui ci sono alcuni link che ho trovato che mi ha aiutato a capire meglio:

http://www.drdobbs.com/open-source/the-new-asyncio-in-python-34-servers-pro/240168408

http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html

http://www.drdobbs.com/open-source/the-new-asyncio-module-in-python-34-even/240168401

http://ntoll.org/article/asyncio

sicuro che non è un libro, ma è un buon punto di partenza

+0

Grazie, conoscere l'Executor potrebbe rivelarsi utile. Tuttavia, "puoi rendere qualsiasi attività non bloccante" presume che io sappia già quali parti stanno bloccando, ma come dovrei? (Vedere l'esempio di 'StreamWriter' sopra.) Ho anche trovato gli articoli che hai citato - speriamo che ci sarà più copertura in futuro. – AnC

+0

Per streamWriter, è un oggetto Streaming, che significa che risponde a tutti i messaggi ricevuti, proprio come un server, quindi non sta bloccando. è solo in ascolto. Per quanto riguarda il dertermine che cosa sta bloccando, bene nel mio caso, ho fatto un test rapido e ho provato a eseguire due compiti contemporaneamente e ho capito che stava bloccando e poi ho capito. Il mio compito era lungo, quindi se provassi a eseguire due nello stesso thread, bloccava l'altro, quindi gli esecutori in modo che le attività avessero il loro thread. Ecco come l'ho capito. Ma ci sono molti casi di utilizzo, e hai ragione, non sono documentati. – Morgan

+0

Anche se Twisted Matrix è diverso, ha aiutato a leggere come funziona: http://stackoverflow.com/questions/6117587/twisted-making-code-non-blocking. Ho anche scoperto questo: https://pypi.python.org/pypi/aioprocessing/0.0.1, che sta cercando di risolvere il problema attraverso le librerie. – Morgan