使用Python中的线程并行打开文件

时间:2013-07-19 22:53:11

标签: python multithreading python-3.x

我是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

我有一个可行的解决方案,其中每个文件在主线程上以串行方式打开,然后在不同的线程上处理,但理想情况下,队列中的每个文件路径都应由其自己的线程打开,读取和处理。

1 个答案:

答案 0 :(得分: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()永远不会当你出错时退出。