Re: Fwd: fork con with

Javier Santana <[email protected]>
Newsgroups gmane.comp.python.general.castellano
Message-ID <[email protected]>
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 <[email protected]>:
> 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 <[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
>>
>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
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.