我有一个非常基本的功能,它通过一个目录,读取文件和收集数据,但是这样做太慢,只使用每个核心的四分之一(四核i5 CPU)来处理能力。如何同时运行该功能4次。因为它通过一个相当大的目录,我可以让参数使用random.shuffle()吗?这是我现在的代码:
import multiprocessing
def function():
while True:
pass #do the code. variables are assigned inside the function.
with Pool(processes=4) as pool:
pool.map(function)
因为该功能不带任何参数,我该怎么办?
答案 0 :(得分:3)
我没有使用map()
,据说地图只需要一个可迭代的参数,理论上,您可以将fuction()
修改为function(one_arg)
或尝试使用空列表或元组或其他可迭代结构,但我没有测试它。
我建议您将所有文件放入队列(可以由进程共享),并将队列共享到多个进程(在您的情况下为4)。完成读取文件后,使用try-except退出。创建4个进程以使用文件队列并退出,直到处理完所有文件。
根据Queue.Empty
和TimeoutError
from multiprocessing import Process
import Queue
def function(files_queue):
try:
filename = files_queue.get(timeout=60) # set timeout
with open(filename) as inputs:
# process lines
# time consuming work is here
except (multiprocessing.TimeoutError, Queue.Empty) as toe:
# queue is empty or timeout
break
if __name__ == '__main__':
files_queue = ... # put all files into queue
processes = list()
# here you need a loop to create 4/multiple processes
p = Process(target=function, args=(files_queue,))
processes.add(p)
p.start()
for pro in processes:
pro.join()
答案 1 :(得分:-2)
此方法pool.map(function)
将创建4个线程,而不是4个进程。所有这些“多处理”都将在4个线程的同一进程中发生。
我建议根据文档here (Python 2)或here (Python 3)使用multiprocessing.Process
。