2015-12-23 8 views
7

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

9

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 considerazione threading 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?

1

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.