0

私はPythonが参照によってオブジェクトを渡したという印象を受けていたので、論理的に(私は思った)、辞書をスレッドのワーカー関数に渡すと、ワーカー関数が戻った後に保持される新しいキーと値のペアを設定できるようになりました。残念ながら、私が間違っているようです!

これ以上苦労することなく、ここにテストケースがあります:

from Queue import Queue
from threading import Thread


def work_fn(dictionary, dfield):
    dictionary[dfield] = True


class Worker(Thread):
    """Thread executing tasks from a given tasks queue"""
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True
        self.start()

    def run(self):
        while True:
            func, args, kargs = self.tasks.get()
            try:
                func(*args, **kargs)
            except Exception, e:
                print e
            self.tasks.task_done()


class ThreadPool(object):
    """Pool of threads consuming tasks from a queue"""
    def __init__(self, num_threads):
        self.tasks = Queue(num_threads)

        for i in range(num_threads):
            Worker(self.tasks)

    def add_task(self, func, *args, **kargs):
        """Add a task to the queue"""
        self.tasks.put((func, args, kargs))

    def wait_completion(self):
        """Wait for completion of all the tasks in the queue"""
        self.tasks.join()


if __name__ == '__main__':
    pool = ThreadPool(4)

    data = [{} for _ in range(10)]
    for i, d in enumerate(data):
        pool.add_task(work_fn, d, str(i))

    pool.wait_completion()

    for d in data:
        print d.keys()

ここで実際に何が起こっているのですか?

どうすればいいですか?

4

1 に答える 1

0

結果を印刷する前にタスクが完了するのを待っている場所がわかりません。ジョブを生成した後、後続のループで結果の収集を行う必要があるようです。

于 2013-02-21T13:43:42.247 に答える