我是python新手,在理解线程的工作原理时遇到了困难。通过浏览文档,我的理解是在线程上调用join()是建议的阻塞方法,直到它完成。

为了提供一些背景知识,我有48个大的csv文件(多GB),我正试图解析这些文件,以便找到不一致之处。线程没有共享状态。这可以在一个合理的时间内一次性完成,但我试图同时作为一个练习。

以下是文件处理的框架:

def process_file(data_file):
with open(data_file) as f:
print "Start processing {0}".format(data_file)
line = f.readline()
while line:
# logic omitted for brevity; can post if required
# pretty certain it works as expected, single 'thread' works fine
line = f.readline()
print "Finished processing file {0} with {1} errors".format(data_file, error_count)
def process_file_callable(data_file):
try:
process_file(data_file)
except:
print >> sys.stderr, "Error processing file {0}".format(data_file)

以及并发位:

^{pr2}$

我把它当作:python -u datautils/cleaner.py > cleaner.out 2> cleaner.err

我的理解是join()应该阻止调用它的线程等待被调用的线程完成,但是我观察到的行为与我的预期不符。

我从未在错误文件中看到错误,但也从未在stdout上看到预期的日志消息。

父进程不会终止,除非我从shell中显式地终止它。如果我检查一下我有多少张照片,Finished ...它永远不是预期的48张,而是在12到15张之间。但是,在单线程运行之后,我可以确认多线程运行实际上正在处理所有事情并执行所有预期的验证,只是它似乎没有干净地终止。

我知道我一定是做错了什么,但如果你能给我指出正确的方向,我将不胜感激。