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