Fwd: fork con with

Chema Cortes py en ch3m4.org
Jue Oct 15 04:23:48 CEST 2009


El Miércoles, 14 de Octubre de 2009 10:12:15 Javier Santana escribió:


> Después de esta breve intro, voy al tema. Si mirais el código fuente
> de la versión ruby hace:
> 
> 3.times do
>  fork do
>  # code
> 
>  end
> end
> 
> Me pregunto si en python sería posible hacer algo así, si se os ocurre
> la forma de hacerlo, esto es, de ejecutar el bloque de código dentro
> de with en el hijo creado (y no en el padre).

Más allá de lo que pueda parecer, los bloques "with" de python (bloques de 
"contexto") no funcionan de igual manera que las "clausuras" de ruby. Los 
contextos tan sólo unifican en un único interface el control de las 
excepciones, por lo que será necesario añadir más código si quieres que el 
manejador de contexto también pueda sincronizar el acceso a los datos 
compartidos por parte de los procesos de ejecución (por ejemplo, mediante el 
módulo "multiprocessing").


> Sólamente se me ha ocurrido algo así:
> 
> with fork() as pid:
>    if pid == 0:
>       #code

Más o menos, ésa es la idea, aunque no deberías nunca usar 'with' sin un 
manejador de contexto (fork() no lo es).

Así a vuelapluma, la única parte del código de Jacob suceptible de meterse en 
un bloque with sería aquella en donde se bloquea el socket en espera de 
conexiones. Habría que cambiar un poco el código:

class Acceptor(object):

  def __init__(self, host="localhost", port="4242"):
    self.acceptor = acceptor = socket.socket()
    acceptor.bind((host,port))
    acceptor.listen(10)

  def __enter__(self):
    conn,addr=self.acceptor.accept()
    return conn

  def __exit__(self, exc_type, exc_value, traceback):
    if exc_type is KeyboardInterrupt:
      sys.exit()

acceptor=Acceptor()

....

for i in range(3):
 pid=os.fork()
 if pid==0:
   ...
   with acceptor as conn:
     ....


------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.python.org/pipermail/python-es/attachments/20091015/b0f8f826/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es