Pregunta Multiproceso vs Threading Python


Estoy tratando de entender las ventajas de multiproceso encima enhebrado. Yo sé eso multiproceso se mueve alrededor del bloqueo de intérprete global, pero ¿qué otras ventajas existen? enhebrado No hagas lo mismo?


559
2018-06-15 11:12


origen


Respuestas:


los threading el módulo usa hilos, el multiprocessing el módulo usa procesos. La diferencia es que los hilos se ejecutan en el mismo espacio de memoria, mientras que los procesos tienen memoria separada. Esto hace que sea un poco más difícil compartir objetos entre procesos con multiprocesamiento. Como los hilos utilizan la misma memoria, se deben tomar precauciones o dos hilos escribirán en la misma memoria al mismo tiempo. Esto es para lo que sirve el bloqueo de intérprete global.

Los procesos de desove son un poco más lentos que los hilos de desove. Una vez que se están ejecutando, no hay mucha diferencia.


477
2018-06-15 11:19



Aquí hay algunos pros / contras que se me ocurrió.

Multiprocesamiento

Pros

  • Espacio de memoria separado
  • El código es generalmente sencillo
  • Aprovecha múltiples CPU y núcleos
  • Evita las limitaciones de GIL para cPython
  • Elimina la mayoría de las necesidades de primitivas de sincronización, a menos que use la memoria compartida (en cambio, es más un modelo de comunicación para IPC)
  • Los procesos hijo son interrumpibles / killable
  • Pitón multiprocessing módulo incluye abstracciones útiles con una interfaz muy similar threading.Thread
  • Una visita obligada con cPython para el procesamiento de CPU

Contras

  • IPC un poco más complicado con más sobrecarga (modelo de comunicación vs. memoria compartida / objetos)
  • Huella de memoria más grande

Enhebrado

Pros

  • Ligero - huella de memoria baja
  • Memoria compartida: facilita el acceso al estado desde otro contexto
  • Le permite hacer fácilmente IU receptivas
  • Los módulos de extensión cPython C que liberan correctamente el GIL se ejecutarán en paralelo
  • Gran opción para aplicaciones de E / S

Contras

  • cPython: sujeto a GIL
  • No interrumpible / killable
  • Si no se sigue un modelo de bomba de cola / mensaje de comando (usando el Queue módulo), entonces el uso manual de las primitivas de sincronización se convierte en una necesidad (se necesitan decisiones para la granularidad del bloqueo)
  • El código generalmente es más difícil de entender y acertar: el potencial de condiciones de carrera aumenta drásticamente

646
2018-06-15 14:39



El trabajo de Threading es permitir que las aplicaciones sean receptivas. Supongamos que tiene una conexión de base de datos y necesita responder a la entrada del usuario. Sin enhebrar, si la conexión de la base de datos está ocupada, la aplicación no podrá responder al usuario. Al dividir la conexión de la base de datos en un hilo separado, puede hacer que la aplicación sea más receptiva. Además, debido a que ambos hilos están en el mismo proceso, pueden acceder a las mismas estructuras de datos: buen rendimiento y un diseño de software flexible.

Tenga en cuenta que debido a GIL, la aplicación no está haciendo dos cosas a la vez, pero lo que hemos hecho es colocar el bloqueo de recursos en la base de datos en un hilo separado para que el tiempo de CPU pueda cambiar entre él y la interacción del usuario. El tiempo de CPU se raciona entre los hilos.

El multiprocesamiento es para momentos en los que realmente desea hacer más de una cosa en un momento dado. Supongamos que su aplicación necesita conectarse a 6 bases de datos y realizar una compleja transformación de matriz en cada conjunto de datos. Poner cada trabajo en un hilo separado podría ayudar un poco porque cuando una conexión está inactiva, otra podría obtener algo de tiempo de CPU, pero el procesamiento no se haría en paralelo porque el GIL significa que solo estás usando los recursos de una CPU . Al poner cada trabajo en un proceso de multiprocesamiento, cada uno puede ejecutarse en su propia CPU y ejecutarse con total eficiencia.


155
2018-06-15 13:38



La ventaja clave es el aislamiento. Un proceso de bloqueo no reducirá otros procesos, mientras que un hilo que se cuelga probablemente causará estragos con otros hilos.


34
2018-06-15 11:15



Otra cosa que no se menciona es que depende del sistema operativo que esté utilizando en lo que se refiere a la velocidad. En Windows, los procesos son costosos, por lo que los hilos serían mejores en Windows, pero en los procesos de Unix son más rápidos que sus variantes de Windows, por lo que usar procesos en Unix es mucho más seguro y rápido de generar.


24
2018-06-15 11:22



Otras respuestas se han centrado más en el aspecto de multiprocesamiento frente a multiprocesamiento, pero en Python Global Interpreter Lock (GIL) tiene que ser tenido en cuenta. Cuando más número (digamos k) de hilos creados, generalmente no aumentarán el rendimiento  k  veces, ya que todavía se ejecutará como una única aplicación de subprocesos. GIL es un bloqueo global que bloquea todo y permite solo la ejecución de un único subproceso utilizando un solo núcleo. El rendimiento aumenta en lugares donde se usan extensiones C como numpy, Network, I / O, donde se realiza mucho trabajo de fondo y se lanza GIL.
 Así que cuando enhebrado se usa, solo hay un único subproceso de nivel de sistema operativo mientras que python crea pseudo-hilos que se administran completamente al enrutarse, pero que se ejecutan esencialmente como un único proceso. La preferencia se produce entre estos pseudo hilos. Si la CPU se ejecuta a la capacidad máxima, es posible que desee cambiar a multiprocesamiento.
Ahora, en el caso de instancias de ejecución autónomas, puede optar por el grupo. Pero en caso de superposición de datos, donde es posible que desee que los procesos se comuniquen, debe usar multiprocessing.Process.


10
2018-06-02 06:46



El proceso puede tener múltiples subprocesos, estos subprocesos pueden compartir memoria. Si tiene en cuenta el proceso múltiple frente a varios hilos, hilos además del proceso. proceso se está ejecutando en la CPU. por lo que los hilos residen en los procesos. Proceso son entidades individuales que se ejecutan de forma independiente. Si desea compartir datos o estado entre el proceso, puede usar el lugar común donde almacenar datos (por ejemplo, caché (redis, memcache), archivos, base de datos)


0
2017-09-18 07:49