Ho letto sul modulo asyncio in python 3 e più in generale sulle coroutine in python e non riesco a ottenere ciò che rende asyncio un così grande strumento. Ho la sensazione che tutto ciò che puoi fare con le coroutine, puoi farlo meglio usando le code di attività basate sul modulo multiprocessing (il sedano per esempio). Esistono casi in cui le coroutine sono migliori delle code di attività?asyncio e coroutine vs code di attività
risposta
Non è una risposta corretta, ma un elenco di suggerimenti che non poteva andare bene in un commento:
Si citano il modulo
multiprocessing
(e prendiamo in considerazionethreading
troppo). Supponiamo di dover gestire centinaia di socket: puoi generare centinaia di processi o thread?Ancora, con thread e processi: come gestisci l'accesso simultaneo alle risorse condivise? Qual è il sovraccarico di meccanismi come il blocco?
Anche quadri come il Celery aggiungono un sovraccarico importante. Puoi usarlo, ad es. per la gestione di ogni singola richiesta su un server Web con traffico elevato? A proposito, in quello scenario, chi è responsabile della gestione delle prese e delle connessioni (Celery per sua natura non può farlo per te)?
Assicurarsi di leggere the rationale behind asyncio. Questa motivazione (tra le altre cose) menziona una chiamata di sistema:
writev()
- non è molto più efficiente di piùwrite()
s?
Aggiungendo alla risposta di cui sopra:
Se il compito a portata di mano è legato I/O e opera su una di dati condivisi, co-routine e asyncio sono probabilmente la strada da percorrere.
Se, al contrario, si dispone di attività associate alla CPU in cui i dati non sono condivisi, un sistema di multiprocessing come Celery dovrebbe essere migliore.
Se l'attività a portata di mano è un limite di CPU e I/O e non è richiesta la condivisione dei dati, utilizzerei comunque Celery. È possibile utilizzare l'I/O asincrono da Celery!
Se si dispone di un task associato alla CPU ma con la necessità di condividere i dati, l'unica opzione valida che vedo ora è quella di salvare i dati condivisi in un database. Ci sono stati tentativi recenti come pyparallel
ma sono ancora in corso.
- 1. asyncio coda consumatore coroutine
- 2. Coroutine reciprocamente ricorsive con asyncio
- 3. Come deridere le coroutine asyncio?
- 4. Python asyncio: lettore di callback e comunicazione coroutine
- 5. come memorizzare nella cache asyncio coroutine
- 6. Julia: passaggio di dati tra coroutine (attività)
- 7. Modo corretto per arrestare le attività asyncio
- 8. pitone asyncio forza timeout
- 9. comprensione asyncio già in esecuzione ciclo continuo e attività in sospeso
- 10. Esempio di debug di asyncio di Python
- 11. Utilizzo di Cython con Asyncio (Python 3.4)
- 12. segnali asincroni con asyncio
- 13. Code attività di verifica unità in AppEngine
- 14. Code messaggi vs socket
- 15. VS Codice e attività con il nodo
- 16. multiprocessing vs threading vs asyncio in Python 3.4
- 17. Ingressi attività vs origini attività
- 18. Elaborazione code e code di database
- 19. Differenze tra Coroutine e `goto`?
- 20. Code attività distribuite (ad esempio Celery) e script crontab
- 21. ASP.NET - Inline vs. Code-Behind
- 22. Java reflection vs code generation
- 23. Google Code Hosting vs Sourceforge
- 24. Android - Attività vs Visualizzazioni
- 25. Coroutine tornado
- 26. Chiamare una coroutine da asyncio.Protocol.data_received
- 27. Prestazioni di asyncio
- 28. Come rilevare errori di scrittura in asyncio?
- 29. Boost fallimento coroutine asserzione
- 30. Invia un lavoro a un ciclo di eventi asyncio