Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/04/2013, 12:18
Avatar de razpeitia
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.