Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] fork o usar Thread

Estas en el tema de fork o usar Thread en el foro de Python en Foros del Web. Hola he estado tratando de comprender las diferencias entre los fork y los theread en python : y entiendo lo siguiente : -Thread son hilos ...
  #1 (permalink)  
Antiguo 18/04/2013, 06:52
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años, 7 meses
Puntos: 0
Sonrisa fork o usar Thread

Hola he estado tratando de comprender las diferencias entre los fork y los theread en python :
y entiendo lo siguiente :

-Thread son hilos de un proceso que comparten memoria
- fork , son clones o copias de un proceso

lo que yo intento hacer es varios fork para un proceso y eh visto este pequeño script (fuente :http://goo.gl/kwkXC ) al cual le he agregado un random .. pero no ocurre el random ._.
es decir creo los 7 fork y me devuelve lo mismo , eso me da la siguiente duda "random no es tan random xD" o los fork comparten variables. tambien puede ser que no comprenda algun detalle de los fork ,

de ante mano gracias.



Código Python:
Ver original
  1. #! /usr/bin/python
  2. import os
  3. import random
  4. def child():
  5.    print 'A new child ',  os.getpid( )
  6.    print random.random()
  7.    print random.randrange(0, 101, 2)
  8.    os._exit(0)
  9.  
  10. def parent():
  11.    i=0
  12.    while True:
  13.       newpid = os.fork()
  14.       if newpid == 0:
  15.          child()
  16.       else:
  17.          pids = (os.getpid(), newpid)
  18.          print "parent: %d, child: %d" % pids
  19.       if  i== 7:
  20.         break
  21.       i=i+1
  22.  
  23. parent()
resultados :
Código BASH:
Ver original
  1. -parent: 8836, child: 8837
  2. A new child  8837
  3. 0.773740529819
  4. parent: 8836, child: 8838
  5. 42
  6. parent: 8836, child: 8839
  7. A new child  8839
  8. 0.773740529819
  9. parent: 8836, child: 8840
  10. 42
  11. parent: 8836, child: 8841
  12. A new child  8840
  13. parent: 8836, child: 8842
  14. 0.773740529819
  15. 42
  16. parent: 8836, child: 8843
  17. A new child  8842
  18. parent: 8836, child: 8844
  19. 0.773740529819
  20. 42
  21. A new child  8844
  22. 0.773740529819
  23. 42
  24. A new child  8843
  25. 0.773740529819
  26. 42
  27. A new child  8841
  28. 0.773740529819
  29. 42
  30. A new child  8838
  31. 0.773740529819
  32. 42
  #2 (permalink)  
Antiguo 18/04/2013, 12:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: fork o usar Thread

Ejemplo 1: ¿Como usar fork?
Código Python:
Ver original
  1. import os
  2. pid = os.fork()
  3. print pid

¿Que esta pasando aquí? Yo solamente puse un print ¿por que imprime 2 veces?
Una vez que llega a os.fork() el programa se divide en 2 flujos el flujo del padre y el flujo del hijo. El padre tiene un pid diferente de 0, mientras que el hijo tiene pid 0.

Ejemplo 2: ¿Como saber quien es el hijo y quien el padre?
Código Python:
Ver original
  1. import os
  2. pid = os.fork()
  3. if pid == 0:
  4.     print "Hijo:", pid
  5. else:
  6.     print "Padre:", pid


Ejemplo 3: Los hijos también pueden ser padres.
Código Python:
Ver original
  1. import os
  2. pid = os.fork()
  3. if pid == 0:
  4.     print "Hijo:", pid, os.getpid()
  5.     pid = os.fork()
  6.     if pid == 0:
  7.         print "    Hijo:", pid, os.getpid()
  8.     else:
  9.         print "    Padre:", pid, os.getpid()
  10. else:
  11.     print "Padre:", pid, os.getpid()
Donde pid indica el pid del hijo y os.getpid() es el pid del proceso que esta corriendo.


Ejemplo 4: Esperar a que un hijo termine
Código Python:
Ver original
  1. import os
  2. from time import sleep
  3.  
  4. child_pid = os.fork()
  5.  
  6. if child_pid == 0:
  7.     print "Hijo Iniciando"
  8.     sleep(2)
  9.     print "Hijo Trabajando 1, 2, 3..."
  10.     sleep(2)
  11.     print "Hijo Terminado"
  12.     os._exit(0)
  13. else:
  14.     print "Padre Iniciado"
  15.     os.waitpid(child_pid, 0)
  16.     print "Padre Terminado"

Ejemplo 6: Múltiples hijos
Código Python:
Ver original
  1. import os
  2. from time import sleep
  3.  
  4. NUM_PROCESS = 7
  5.  
  6. children = []
  7.  
  8. print "Padre Iniciado"
  9.  
  10. for i in range(NUM_PROCESS):
  11.     child_pid = os.fork()
  12.     if child_pid:
  13.         children.append(child_pid)
  14.     else:
  15.         sleep(1)
  16.         print "Child %d" % (i,)
  17.         os._exit(0)
  18.  
  19. for child in children:
  20.     os.waitpid(child, 0)
  21. print "Padre Terminado"

Ejemplo 7: Random
Código Python:
Ver original
  1. import os
  2. import random
  3.  
  4. NUM_PROCESS = 7
  5.  
  6. children = []
  7.  
  8. print "Padre Iniciado"
  9.  
  10. for i in range(NUM_PROCESS):
  11.     child_pid = os.fork()
  12.     if child_pid:
  13.         children.append(child_pid)
  14.     else:
  15.         random.seed()
  16.         print "Child %d %d" % (i, random.randrange(0, 101, 2))
  17.         os._exit(0)
  18.  
  19. for child in children:
  20.     os.waitpid(child, 0)
  21. print "Padre Terminado"
Recuerdas que un fork es una copia del proceso verdad? Bueno, esa copia también incluye la semilla cuando haces el import random, entonces todos los forks tienen la misma semilla y si todos los forks tienen la misma semilla y usan el mismo algoritmo entonces obviamente te va a dar los mismo números. La solución a esto es reestablecer la semilla en cada proceso hijo.
  #3 (permalink)  
Antiguo 18/04/2013, 14:05
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años, 7 meses
Puntos: 0
Sonrisa Respuesta: fork o usar Thread

razpeitia , exelente maestro , con esa repuesta me ha quedado mas que claro el tema de como funciona un fork ,
pero sabes que : me queda un asuntillo con el tema del waitpid :
- En tu ejemplo 4,5,6 ¿ el waitpid , sirve para controlar el cierre del pid padre ? .

De ante mano muchas gracias . y los ejemplos estan exelentisimos para aprender.
Saludos.
  #4 (permalink)  
Antiguo 18/04/2013, 14:13
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: fork o usar Thread

En los ejemplos waitpid es para que el proceso padre espere a que sus hijos terminen.

Obviamente los procesos hijos no llegan a correr el bloque final de los ejemplos 6 y 7 por que os._exit es ejecutado antes. La diferencia de os.exit y os._exit es que os._exit es para los procesos hijos.

Por ultimo si vas hacer uso de procesos para asuntos de concurrencia, entonces te recomiendo que manejes multiprocessing, que es mucho mas cómodo para trabajar.
  #5 (permalink)  
Antiguo 18/04/2013, 14:21
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años, 7 meses
Puntos: 0
De acuerdo Respuesta: fork o usar Thread

ok , me quedo super claro .
Nuevamente muchas gracias.
revisare el link :D
Saludos.

Cita:
Iniciado por razpeitia Ver Mensaje
En los ejemplos waitpid es para que el proceso padre espere a que sus hijos terminen.

Obviamente los procesos hijos no llegan a correr el bloque final de los ejemplos 6 y 7 por que os._exit es ejecutado antes. La diferencia de os.exit y os._exit es que os._exit es para los procesos hijos.

Por ultimo si vas hacer uso de procesos para asuntos de concurrencia, entonces te recomiendo que manejes [URL="http://docs.python.org/2/library/multiprocessing.html"]multiprocessing[/URL], que es mucho mas cómodo para trabajar.

Etiquetas: usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:16.