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.Process
ya 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.