我是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
我有一个可行的解决方案,其中每个文件在主线程上以串行方式打开,然后在不同的线程上处理,但理想情况下,队列中的每个文件路径都应由其自己的线程打开,读取和处理。
答案 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()
永远不会当你出错时退出。