2015-12-15 3 views
5

Я хочу подмножество многопроцессорности.Queue для реализации процессов для захвата кусков очереди. Единственная проблема: я получаю странный TypeError?многопроцессорный вызов подкласса очереди

#!/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)] 

тестирование этого (я разделил это так, что я не тянул ни в чем друг)

| => ./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

Как вы инициализируете очередь? – eugecm

+0

Я не. То, что вы видите, - это весь тест. Я вообще не звоню или не использую его. – SkyLeach

+0

Я думаю, что это должно быть связано с тем, что многопроцессорность.Queue обрабатывает локальные/общие ресурсы? вызывая спецификацию класса во время загрузки JIT в качестве TypeDef, означает, что что-то в ядре получает отброшенное AFAICT – SkyLeach

ответ

5

multiprocessing.Queue является методом, который создает очередь, так что вы Предполагается использовать его как функцию my_queue = Queue().

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

Как вы можете видеть, это не «тип», который вы использовали бы в подклассе.

Если вы хотите реализовать свою собственную очередь, вы могли бы взглянуть на queue.Queue

EDIT:

Если вы хотите, чтобы подклассы очередь из многопроцессорной, используйте multiprocessing.queues.Queue вместо этого, что тип от объекта, возвращаемого multiprocessing.Queue()

+1

Да, документы должны что-то сделать. он специально называется классом в документации, и, кроме того, функция возвращает класс. Затем, кроме того, queue.Queue не становится сериализованным и, следовательно, не полезна для многопроцессорности. Процессы, которые нажимают на очередь, находятся в совершенно другом интерпретаторе, чем тот, который его потребляет. – SkyLeach

+0

Тестирование этого теперь, чтобы увидеть, работает ли оно или ломается. У меня есть сомнения, что это будет работать. – SkyLeach

+0

расширение multiprocessing.queues.Queue, а затем создание экземпляра в контексте менеджера процессов, похоже, работает (queue = BufferQueue (ctx = get_context())) – SkyLeach

Смежные вопросы