python multiprocessing gevent

python - Uso de multinúcleo Gevent



multiprocessing (1)

Acabo de comenzar con Python Gevent y me preguntaba sobre el uso de CPU / mulitcore de la biblioteca.

Intentando algunos ejemplos haciendo muchas solicitudes a través del urllib de Monkeypatched, noté que se estaban ejecutando solo en un núcleo con una carga del 99%.

¿Cómo puedo usar todos los núcleos con gevent usando python? ¿Hay buenas prácticas? ¿O hay efectos secundarios utilizando múltiples procesos y gevent?

BR Dan


Gevent le da la capacidad de lidiar con las solicitudes de bloqueo. No le da la capacidad de ejecutar en varios núcleos.

Solo hay un greenlet (corvina de gevent) ejecutándose en un proceso de python en cualquier momento. El beneficio real de gevent es que es muy poderoso cuando se trata de cuellos de botella de E / S (como suele ser el caso de las aplicaciones web generales, aplicaciones web que sirven como puntos finales de API, aplicaciones de chat basadas en web o backend y, en general, aplicaciones en red ). Cuando hacemos algunos cálculos pesados ​​de CPU, no habrá ganancia de rendimiento con el uso de gevent. Cuando una aplicación está vinculada a E / S, gevent es pura magia.

Hay una regla simple: los Greenlets se desactivan cada vez que se bloquea una operación de E / S o cuando se hace el cambio explícitamente (por ejemplo, con gevent.sleep ())

Los hilos de Python incorporados en realidad se comportan de la misma manera (pseudo) "concurrente" que los Greenlets de Gevent.

La diferencia clave es la siguiente: los greenlets utilizan la multitarea cooperativa, donde los subprocesos usan la multitarea preventiva. Lo que esto significa es que un greenlet nunca dejará de ejecutarse y "cederá" a otro greenlet a menos que use ciertas funciones de "rendimiento" (como gevent.socket.socket.recv o gevent.sleep).

Los subprocesos, por otro lado, cederán a otros subprocesos (a veces de forma impredecible) según el momento en que el sistema operativo decida intercambiarlos.

Y, por último, para utilizar varios núcleos en Python , si eso es lo que quiere, tenemos que depender del módulo de multiprocesamiento (que es un módulo incorporado en Python). Esto "consigue alrededor de GIL". Otras alternativas incluyen usar Jython o ejecutar tareas en paralelo (en diferentes CPU) usando una cola de tareas, por ejemplo, Zeromq.

Escribí una explicación muy larga aquí: http://learn-gevent-socketio.readthedocs.org/en/latest/ . Si te importa sumergirte en los detalles. :-RE