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-----