Fwd: fork con with

Javier Santana qualopec en gmail.com
Jue Oct 15 08:45:24 CEST 2009


Una aclaración, cuando puser with fork(): el fork era una clase que
había hecho, más o menos así:

class fork:
   def __enter__(self):
       pid = os.fork()


2009/10/15 Chema Cortes <py en ch3m4.org>:
> 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
>
_______________________________________________
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