-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 回答