Fwd: fork con with

Javier Santana qualopec en gmail.com
Jue Oct 15 08:49:22 CEST 2009


De nuevo doy a enviar sin terminar... lo siento y termino :).

class fork:
   def __enter__(self):
       pid = os.fork()
       return pid;
   def __exit__(....):
       pass

La verdad que la forma "bloque" de ruby es bastante visual, de ahí que
quería hacer algo similar.

La forma más elegante de hacerlo con python sería algo así:
http://gist.github.com/204027

2009/10/15 Javier Santana <qualopec en gmail.com>:
> 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