[pyar] Heredando del Queue multiprocessing

6 views
Skip to first unread message

Facundo Batista

unread,
May 1, 2011, 4:52:07 PM5/1/11
to Python Argentina
Contexto: Estoy haciendo una aplicación que mezcla GTK, Twisted y
multiprocessing. En una parte, levanto un proceso y me comunico con
colas. Como lo uso desde twisted, armé un DeferredQueue que
basicamente tiene un deferred_get que devuelve un deferred que se
dispara con datos que vinieron en la cola cuando estos llegan (o sea,
no bloquea).

Problema: No puedo heredar del Queue de multiprocessing! :|

fPython 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
>>> from multiprocessing import Queue
>>> class D(Queue):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
function() argument 1 must be code, not str

queloqué?

¿Alguien se chocó con algo similar?

Gracias! Slds.

--
.    Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

Diego Mascialino

unread,
May 1, 2011, 5:11:43 PM5/1/11
to pyar
Excerpts from Facundo Batista's message of 2011-05-01 17:52:07 -0300:

> Problema: No puedo heredar del Queue de multiprocessing! :|
>
> fPython 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
> >>> from multiprocessing import Queue
> >>> class D(Queue):
> ... pass
> ...
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: Error when calling the metaclass bases
> function() argument 1 must be code, not str
>
> queloqué?
>
> ¿Alguien se chocó con algo similar?
No nunca me choqué con esto, pero viendo:
/usr/lib/python2.7/multiprocessing/__init__.py está:

def Queue(maxsize=0):
'''
Returns a queue object
'''
from multiprocessing.queues import Queue
return Queue(maxsize)


Por lo que supongo, que debes heredar de multiprocessing.queues.Queue .

Alguna idea de para qué hacen esa función Queue en __init__.py en lugar de algo
como:

Queue = multiprocessing.queues.Queue

Saludos,
Diego

Facundo Batista

unread,
May 1, 2011, 5:13:10 PM5/1/11
to Python Argentina
On Sun, May 1, 2011 at 6:11 PM, Diego Mascialino
<di...@mascialino.com.ar> wrote:

> No nunca me choqué con esto, pero viendo:
> /usr/lib/python2.7/multiprocessing/__init__.py está:

Claro! Había hecho un grep en multiprocessing y se me pasó esta definición :(


> Por lo que supongo, que debes heredar de multiprocessing.queues.Queue .

Exacto.


> Alguna idea de para qué hacen esa función Queue en __init__.py en lugar de algo
> como:
>
> Queue = multiprocessing.queues.Queue

No. Es raro, ¿no?

Muchas gracias!

--
.    Facundo

SAn

unread,
May 1, 2011, 6:33:02 PM5/1/11
to Python Argentina
2011/5/1 Facundo Batista <facundo...@gmail.com>:

> On Sun, May 1, 2011 at 6:11 PM, Diego Mascialino
> <di...@mascialino.com.ar> wrote:
>
>> No nunca me choqué con esto, pero viendo:
>> /usr/lib/python2.7/multiprocessing/__init__.py está:
>
> Claro! Había hecho un grep en multiprocessing y se me pasó esta definición :(
>
>
>> Por lo que supongo, que debes heredar de multiprocessing.queues.Queue .
>
> Exacto.
>
>
>> Alguna idea de para qué hacen esa función Queue en __init__.py en lugar de algo
>> como:
>>
>> Queue = multiprocessing.queues.Queue
>
> No. Es raro, ¿no?

Se que no aporta mucho, pero estoy casi seguro de haber leido algo del
autor de multiprocessing sobre heredar de las Queue. No recuerdo si
era que no era buena idea, o que no le gustaba cómo estaba
implementado. Pero no lo puedo encontrar :/

Claudio Freire

unread,
May 2, 2011, 4:03:54 AM5/2/11
to Python Argentina
2011/5/1 Facundo Batista <facundo...@gmail.com>:

>> Queue = multiprocessing.queues.Queue
>
> No. Es raro, ¿no?
>
> Muchas gracias!

Capaz que mas acorde del disenio de Queue seria que inyectes tus
versiones decoradas:

from multiprocessing import Queue

def DeferredQueue(*p, **kw):
q = Queue(*p, **kw)
q.deferred_get = lambda *p, **kw : deferred(... q.get(*p, **kw) )
...

Es mas feo, lo concedo, pero no salteas el mecanismo de construccion
de Queues de multiprocessing.

Reply all
Reply to author
Forward
0 new messages