从线程调用的函数中的值总和

Sum of values in a function called from thread

我几乎没有每行包含一些数字的文本文件。我读取了文件并在函数中显示了每个数字的总数。

from Queue import Queue
from threading import Thread
import os

enclosure_queue = Queue()
list=[]

def getAllFiles():
    for root, dirs, files in os.walk("C:/Users/test"):
        for file in files:
            if file.endswith(".txt"):
                file_path= os.path.join(root, file) 
                list.append(file_path)

def calc(i, q):
    while True:
        file = q.get()
        fileData = open(file, 'r')
        add=0
        for line in fileData:
            add= add + int(line)    
        print str(add) + '\n'
        q.task_done()

getAllFiles()
num_fetch_threads = len(list)
for i in range(num_fetch_threads):
    worker = Thread(target=calc, args=(i, enclosure_queue,))
    worker.setDaemon(True)
    worker.start()

for ind_file in list:
    enclosure_queue.put(ind_file)

enclosure_queue.join()

它显示单个文件行中的数据总和,但我需要将结果相加。 例如,如果 calc 函数的 add300200500 ,我希望最终结果为 1000 。我想将每个结果添加到列表中,然后将其拆分为另一个函数并添加它们。有没有更好的解决方案?

这里不用Queue。使用 multiprocessing.Pool.map,并相应地更改您的 calc 方法。 threading.Thread 也没有 return 结果,而 multiprocessing.Pool.map return 有结果。

import multiprocessing
import os

def getAllFiles():
    my_files = list()
    for root, dirs, files in os.walk("C:/Users/test"):
        for file in files:
            if file.endswith(".txt"):
                file_path= os.path.join(root, file) 
                my_files.append(file_path)
    return my_files

def calc(file):
    with open(file, 'r') as f:
        return sum(map(int, f.readlines()))

if __name__ == '__main__':
    my_files = getAllFiles()
    num_fetch_threads = len(my_files)
    pool = multiprocessing.Pool(processes=num_fetch_threads)
    results = pool.map(calc, my_files)
    result = sum(results)
    print result