使用Multi Thread处理文件使用python3

时间:2017-09-06 11:10:57

标签: python python-2.7 python-3.x multiprocessing python-multithreading

我正在尝试使用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?甚至如何在处理时避免线程的死锁状态,因为这对于进程输出可能是危险的。

请与我分享您的观点。

1 个答案:

答案 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函数不应读取/写入全局变量。