我正在尝试处理python中的多线程。我有工作代码计算字数、文本行数,并创建一个包含每个字数的字典。它在代码注释中提到的小文件上运行得很快。但是我通常使用 glob 来拉入多个文件。当我这样做时,我的运行时间显着增加。同时,由于我的脚本是单线程的,我看到我有 3 个其他内核处于空闲状态,而其中一个已达到最大值。
我想我会给 pythons 多线程模块一个镜头,这是我到目前为止所做的(非工作):
#!/bin/python
#
# test file: http://www.gutenberg.org/ebooks/2852.txt.utf-8
import fileinput
from collections import defaultdict
import threading
import time
inputfilename = 'pg2852.txt'
exitFlag = 0
line = []
line_counter = 0
tot_words = 0
word_dict = defaultdict(int)
def myCounters( threadName, delay):
for line in fileinput.input([inputfilename]):
line = line.strip();
if not line: continue
words = line.split()
tot_words += len(words)
line_counter += 1
for word in words:
word_dict[word] += 1
print "%s: %s:" %( threadName, time.ctime(time.time()) )
print word_dict
print "Total Words: ", tot_words
print "Total Lines: ", line_counter
try:
thread.start_new_thread( myCounters, ("Thread-1", 2, ) )
thread.start_new_thread( myCounters, ("Thread-2", 4, ) )
except:
print "Error: Thread Not Started"
while 1:
pass
对于那些尝试此代码的人,它不起作用。我假设我需要将输入文件分成块并以某种方式合并输出。? 映射/减少?也许有一个更简单的解决方案?
编辑:
也许是这样的:
- 打开文件,
- 把它分成几块
- 将每个块提供给不同的线程
- 获取计数并在每个块上构建 dict
- 合并计数/字典
- 返回结果