2015-12-15 3 views
5

キューのチャンクを取得するプロセスを実装するために、マルチプロセッシングをサブクラス化したい。唯一の問題は、奇妙なTypeErrorが発生していることです。マルチプロセッシングキューのサブクラスの問題

この(私は他の何かに引っ張っていなかったように私はこれを分割)

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

編集/更新テスト

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

+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

関連する問題