2013-03-25 17 views
19

Ho appena iniziato con python gevent e mi chiedevo l'utilizzo della libreria in cpu/mulitcore.Utilizzo multicore Gevent

Provando alcuni esempi facendo molte richieste tramite l'urllib monkeypatched che ho notato, che stavano girando su un core con il 99% di carico.

Come posso utilizzare tutti i core con gevent usando python? Esiste la pratica migliore? O ci sono effetti collaterali che utilizzano più processi e gevent?

BR dan

risposta

47

Gevent ti dà la possibilità di gestire le richieste di blocco. Non ti dà la possibilità di girare su multi-core.

C'è solo un greenlet (coroutine di gevent) in esecuzione in un processo python in qualsiasi momento. Il vero vantaggio di gevent è che è molto potente quando si tratta di colli di bottiglia di I/O (che di solito è il caso di applicazioni Web generali, app Web che servono endpoint API, app di chat basate sul Web o back-end e, in generale, app in rete). Quando eseguiamo calcoli pesanti per la CPU, ci sarà no prestazioni-guadagno dall'uso di gevent. Quando un'app è vincolata all'I/O, gevent è pura magia.

C'è una regola semplice: Greenlets verranno disattivati ​​via ogni volta che un/O-operation vorrei bloccare o quando si esegue l'interruttore in modo esplicito (ad esempio con gevent.sleep())

Il built-in discussioni pitone realtà comportarsi nello stesso modo "concurrent" (pseudo) dei greenlet di gevent.

La differenza principale è questa: i greenlet utilizzano il multitasking cooperativo, in cui i thread utilizzano il multitasking preventivo. Ciò significa che un greenlet non interromperà mai l'esecuzione e "cederà" a un'altra greenlet a meno che non usi determinate funzioni "yielding" (come gevent.socket.socket.recv o gevent.sleep).

Thread, d'altra parte, cederà ad altri thread (a volte imprevedibilmente) in base a quando il sistema operativo decide di scambiarli.

E infine, per utilizzare multi-core in Python - se questo è ciò che si desidera - dobbiamo fare affidamento sul modulo multiprocessing (che è un modulo integrato in Python). Questo "aggira GIL". Altre alternative includono l'utilizzo di Jython o l'esecuzione di attività in parallelo (su diverse CPU) utilizzando una coda di attività, ad es. Zeromq.

Ho scritto una spiegazione molto lunga qui - http://learn-gevent-socketio.readthedocs.org/en/latest/. Se ti interessa immergerti nei dettagli. :-D

+2

Potrei aggiungere che, a seconda dei casi, l'esecuzione di diversi processi Python con gevent potrebbe essere una buona soluzione. Ovviamente questa non è un'opzione nel caso in cui i processi debbano comunicare tra loro in misura significativa. – ferrix

+0

Grazie per la risposta. Quello che voglio è fare quante più operazioni di I/O possibile sulla macchina. La domanda è: sono capace di fare più richieste usando n processi (non thread) dove n = cpu_cores o è gevent con un processo il più velocemente possibile? – thesonix

+1

Ecco come trunk.ly (nelle parole di Alex Dong) ha affrontato un problema legato alla CPU e legato agli I/O (esegue la scansione dei siti e quindi inserisce il contenuto sottoposto a ricerca per indicizzazione in un indice di ricerca) - https://groups.google .com/d/msg/gevent/4hR1P6Vd-uk/4A4bw5ynuucJ –