2015-12-15 6 views
5

Voglio sottoclasse multiprocessing.Queue per l'implementazione dei processi per l'acquisizione di blocchi della coda. L'unico problema è che sto ottenendo uno strano errore TypeError?Problema di sottoclasse della coda di multiprocessing

#!/usr/bin/env python 

#whaaaaa!? 

from multiprocessing import Queue 

class BufferQueue(Queue): 
    '''A thread/process safe queue for append/popleft operations with the import 
    buffer.''' 

    def __init__(self, **kwargs): 
     super(BufferQueue,self).__init__(**kwargs) 

    def consume(self, lim): 
     '''Consume up to but no more than lim elements and return them in a new 
     list, cleaning up the buffer. 

     @params 
     lim -- the maximum (limit) to consume from the list. If less items 
     exist in the list then that's fine too. 
     ''' 
     lim = len(queue) if len(queue) < lim else lim 
     return [self.popleft() for i in range(lim)] 

prove (ho diviso questo in modo che io non stavo tirando in qualsiasi altra cosa)

| => ./tests/wtf_queue.py 
Traceback (most recent call last): 
    File "./tests/wtf_queue.py", line 10, in <module> 
    class BufferQueue(Queue): 
TypeError: method expected 2 arguments, got 3 

Edit/Update:

+0

come si sta inizializzando la coda? – eugecm

+0

Non lo sono. Quello che vedi è l'intero test. In realtà non sto chiamando o usando in alcun modo. – SkyLeach

+0

Penso che questo debba avere a che fare con il modo in cui il multiprocessing.Queue gestisce le risorse locali/condivise? chiamare la specifica della classe durante il caricamento JIT come TypeDef significa che qualcosa nel core sta diventando mazed su AFAICT – SkyLeach

risposta

5

multiprocessing.Queue è un metodo che crea code, in modo da Dovresti usarlo come una funzione my_queue = Queue().

>>> from multiprocessing import Queue 
>>> type(Queue) 
<class 'method'> 

Come puoi vedere non è un 'tipo', che useresti per sottoclasse.

Se si desidera implementare la propria coda, si può dare un'occhiata a queue.Queue

EDIT:

Se si desidera creare una sottoclasse della coda da multiprocessing, utilizzare multiprocessing.queues.Queue invece, che è il tipo di dell'oggetto restituito da multiprocessing.Queue()

+1

Sì, i documenti devono fare qualcosa al riguardo. è specificamente chiamato classe nella documentazione, e inoltre la funzione restituisce una classe. Quindi, in aggiunta, queue.Queue non viene serializzato e quindi non è utile per il multiprocessing. I processi che spingono in coda sono in un interprete completamente diverso da quello che lo consuma. – SkyLeach

+0

Provalo ora per vedere se funziona o si rompe. Ho i miei dubbi sul fatto che questo funzionerà. – SkyLeach

+0

estendere multiprocessing.queues.Queue e quindi istanziarlo nel contesto del gestore processi sembra funzionare (queue = BufferQueue (ctx = get_context())) – SkyLeach