从线程调用的函数中的值总和
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
函数的 add
有 300
、 200
和 500
,我希望最终结果为 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
我几乎没有每行包含一些数字的文本文件。我读取了文件并在函数中显示了每个数字的总数。
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
函数的 add
有 300
、 200
和 500
,我希望最终结果为 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