-1

私はマルチスレッドの経験がなく、Python にはかなり慣れていませんが、スレッドの適用から恩恵を受けるコードがいくつかあります。基本的な例を見つけて、各スレッドがファイルを開いてその内容を処理するように修正しました。唯一の問題は、do_work()ファイルを開こうとすると実行が停止することです

import threading
from queue import Queue

q = Queue()
lock = threading.Lock()

#assuming these files exist
files = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt']

def do_work(item):
    with lock:
        print(item)    #will print file path
    
    with open(item) as fh:
        #but execution never reaches here
        src = fh.read()
        #do stuff with source

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

for i in range(4):
    t = threading.Thread(target=worker)
    t.daemon = True
    t.start()

for f in files:
    q.put(f)    #fill q with file paths to be opened in parallel

q.join()    #block until all tasks are complete

各ファイルがメインスレッドでシリアルに開かれ、個別のスレッドで処理される実用的なソリューションがありますが、理想的には、キュー内の各ファイルパスは独自のスレッドで開かれ、読み取られ、処理される必要があります。

4

1 に答える 1

1

Python 3.3で動作します

do_work(1) がログに記録されておらず、(2) が呼び出されていないというエラーがあると思いますtask_done

だから変更:

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

def worker():
    while True:
        item = q.get()
        try:
            do_work(item)
        except Exception as e:
            print(e)
        finally:
            q.task_done()

は必要ありませんexcept(役に立つかもしれないものを出力するためだけですfinally) q.join()

于 2013-07-20T09:43:28.867 に答える