Re: Fwd: fork con with

Chema Cortes <[email protected]>
Newsgroups gmane.comp.python.general.castellano
Organization ch3m4.org
Message-ID <[email protected]>
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:
     ....

_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
signature.asc (application/pgp-signature, 190 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.11 (GNU/Linux)

iD8DBQBK1oe6a1V4BoHtm6IRAiImAKDC7aniAXMXOESnlVYaYAYZfLvl/ACfc8FG
UGDFDY3p6/cAjHEITNN9l6M=
=B5hV
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.