2015-12-15 22 views
5

Tôi muốn phân lớp multiprocessing.Queue để thực hiện các quy trình lấy khối của hàng đợi. Vấn đề duy nhất là, tôi nhận được một TypeError lạ?multiprocessing Queue subclass issue

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

thử nghiệm này (tôi chia này ra vì vậy mà tôi đã không kéo trong bất cứ điều gì khác)

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

Chỉnh sửa/Cập nhật:

+0

cách bạn khởi tạo hàng đợi? – eugecm

+0

Tôi không. Những gì bạn thấy là toàn bộ bài kiểm tra. Tôi không thực sự gọi hoặc sử dụng nó theo bất kỳ cách nào. – SkyLeach

+0

Tôi nghĩ rằng điều này có liên quan đến cách đa xử lý. Queue xử lý các tài nguyên cục bộ/chia sẻ? gọi đặc tả lớp trong khi JIT tải như một TypeDef có nghĩa là một cái gì đó trong lõi là nhận được munged AFAICT – SkyLeach

Trả lời

5

multiprocessing.Queue là một phương pháp tạo ra hàng đợi, vì vậy bạn được cho là sử dụng nó như một hàm my_queue = Queue().

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

Như bạn có thể thấy không phải là 'loại', mà bạn sẽ sử dụng cho phân lớp.

Nếu bạn muốn thực hiện hàng đợi riêng bạn, bạn có thể có một cái nhìn tại queue.Queue

EDIT:

Nếu bạn muốn phân lớp hàng đợi từ đa, sử dụng multiprocessing.queues.Queue thay vào đó, đó là loại đối tượng được trả về bởi multiprocessing.Queue()

+1

Vâng các tài liệu cần phải làm điều gì đó về việc này. nó được gọi cụ thể là một lớp trong tài liệu, và ngoài ra hàm trả về một lớp. Sau đó, trên hết, queue.Queue không được serialized và do đó không hữu ích cho việc xử lý đa. Các quy trình đẩy lên hàng đợi nằm trong một trình thông dịch hoàn toàn khác với trình thông dịch tiêu thụ nó. – SkyLeach

+0

Kiểm tra điều này ngay bây giờ để xem nó có hoạt động hay không. Tôi có nghi ngờ của tôi rằng làm điều này sẽ làm việc. – SkyLeach

+0

mở rộng multiprocessing.queues.Queue và sau đó instantiating nó trong bối cảnh quản lý quy trình có vẻ là làm việc (queue = BufferQueue (ctx = get_context())) – SkyLeach