Saltar al contenido

Diferencia de comportamiento entre os.fork y multiprocessing.Process

Te damos la bienvenida a nuestro espacio, ahora vas a encontrar la solucíon a lo que estabas buscando.

Solución:

La respuesta que está buscando se aborda en detalle aquí. También hay una explicación de las diferencias entre los diferentes sistemas operativos.

Un gran problema es que el fork La llamada al sistema no existe en Windows. Por lo tanto, cuando ejecuta un sistema operativo Windows, no puede usar este método. multiprocessing es una interfaz de nivel superior para ejecutar una parte del programa que se está ejecutando actualmente. Por lo tanto, al igual que la bifurcación, crea una copia del estado actual de su proceso. Es decir, se encarga de bifurcar tu programa por ti.

Por lo tanto, si está disponible, podría considerar fork() una interfaz de nivel inferior para bifurcar un programa, y ​​el multiprocessing biblioteca para ser una interfaz de nivel superior para la bifurcación.

Para responder a su pregunta directamente, debe haber algún efecto secundario de external_process eso hace que cuando el código se ejecute en serie, obtenga resultados diferentes que si los ejecuta al mismo tiempo. Esto se debe a cómo configuró su código y a la falta de diferencias entre os.fork y multiprocessing.Process en sistemas que os.fork esta apoyado.


La única diferencia real entre el os.fork y multiprocessing.Process es la portabilidad y la sobrecarga de la biblioteca, ya que os.fork no es compatible con Windows, y el multiprocessing marco está incluido para hacer multiprocessing.Process trabajar. Esto es porque os.fork es llamado por multiprocessing.Processya que esta respuesta respalda.

La distinción importante, entonces, es os.fork copia todo en el proceso actual utilizando la bifurcación de Unix, lo que significa que en el momento de la bifurcación, ambos procesos son iguales con diferencias de PID. En Windows, esto se emula volviendo a ejecutar todo el código de configuración antes de que if __name__ == '__main__':que es más o menos lo mismo que crear un subproceso usando el subprocess biblioteca.

Para usted, los fragmentos de código que proporciona están haciendo cosas bastante diferentes a las anteriores, porque llama external_function en main antes de abrir el nuevo proceso en el segundo clip de código, haciendo que los dos procesos se ejecuten en serie pero en procesos diferentes. Además, la canalización es innecesaria, ya que no emula ninguna funcionalidad del primer código.

En Unix, los fragmentos de código:

import os

pid = os.fork()

if pid == 0:
    os.environ['HOME'] = "rep1"
    external_function()
else:
    os.environ['HOME'] = "rep2"
    external_function()

y:

import os
from multiprocessing import Process

def f():
    os.environ['HOME'] = "rep1"
    external_function()

if __name__ == '__main__':
    p = Process(target=f)
    p.start()
    os.environ['HOME'] = "rep2"
    external_function()
    p.join()

debería hacer exactamente lo mismo, pero con un poco de sobrecarga adicional de la biblioteca de multiprocesamiento incluida.


Sin más información, no podemos averiguar cuál es el problema. Si puede proporcionar un código que demuestre el problema, eso nos ayudaría a ayudarlo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *