2

Queue doc pageの下部からキューの実装を使用していますが、いくつか質問があります。

  1. 50 のスレッドがあり、何十万もの JSON ファイルをフェッチします。スレッド数の 2 倍に設定するのは良い考えQueue(maxsize=ですか、それともそれより多くても少なくてもよいでしょうか?

  2. worker関数を別のモジュールに入れたい。どうすればいいですか?そうしようとすると、関数NameError: global name 'q' is not definedの 行に入ります。item = q.get()関数に追加global qしても役に立ちません。

編集:そのコードに最小限の変更を加えて、ワーカー関数を別のモジュールに移動することは可能ですか? 私はオブジェクトをあまりよく理解していないので、コードをできるだけシンプルに保ちたいと思っています。

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()      
4

1 に答える 1

1

このようなことを試すことができます

class Worker(threading.Thread):
    def __init__(self,inputQueue,inputLock):
        threading.Thread.__init__(self)
        self.inputQueue=inputQueue
        self.inputLock=inputLock          

    def run(self):       
        while True:
            if not self.inputQueue.empty():
                self.inputLock.acquire()
                item=self.inputQueue.get()
                self.inputLock.release()
        #process item
                self.inputQueue.task_done()
            else:
                time.sleep(1)

class Main():

    def __init__(self):
        self.workersQueue = Queue.Queue()
        self.workersLock = threading.RLock()
        self.workers = list()

        #start threads
        for index in range(10):            
            self.uploaders.append(Worker(self.workersQueue, self.workersLock))
            self.uploaders[index].start()

        self.workersQueue.join()

ここで worker はクラス (キューが共有されるスレッド) です。メイン クラスを使用してワーカーを作成し、ワーカー スレッドに必要なデータをロードします。

これが役立つことを願っています

于 2013-01-05T17:43:21.860 に答える