我正在尝试使用CPU的单核处理文件。但我想使用单核心是不够的。相反,如果我可以访问系统的多个核心,那么我可以让流程运行得更好更快。
但不幸的是,我知道只使用单核处理文件。这是我做的:
data = open('datafile','r',encoding='ascii',errors='ignore')
for line in data.readlines():
splitted = line.lower().strip().split()
check = process(splitted[0],splitted[1])
if check == '':
pass
data.close()
我想知道如何在分别取process()
并根据需要获取输出的同时使用CPU的完整容量来处理line
?甚至如何在处理时避免线程的死锁状态,因为这对于进程输出可能是危险的。
请与我分享您的观点。
答案 0 :(得分:1)
首先:您需要多个进程才能使用多个核心。不是线程。由于GIL,这是一个限制。
现在,这是一个如何使用multiprocessing.Pool
实现它的示例:
from multiprocessing import Pool, cpu_count
def process(arg1, arg2):
...
workers_count = 2*cpu_count()+1 # or whatever you need
pool = Pool(processes=workers_count)
with open('datafile','r',encoding='ascii',errors='ignore') as fo:
buffer = []
for line in fo:
splitted = line.lower().strip().split()
buffer.append((splitted[0], splitted[1]))
if len(buffer) == workers_count:
results = pool.map(process, buffer)
buffer = []
# do something with results
if buffer:
results = pool.map(process, buffer)
# do something with results again
它是什么呢?它逐行读取文件,一旦收集到足够的数据,它就会将它发送到多进程池并等待并行处理。请注意,除非你有SSD,否则并行运行磁盘io只会降低性能(同时并行逐行读取并不是一件容易的事。)
您必须注意的是,由于使用了多个进程,因此无法在它们之间共享内存,即process
函数不应读取/写入全局变量。