Skip to main content
 首页 » 编程设计

python之使用多线程使用python3处理文件

2025年02月15日32jirigala

我正在尝试使用我的 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() 

我想知道如何使用 CPU 的全部容量来处理 process(),同时单独获取 line 并获得所需的输出?甚至我如何在处理时避免线程的死锁状态,因为这对进程输出来说可能是危险的。

请与我分享您的观点。

请您参考如下方法:

首先:您需要多个进程来利用多个内核。不是线程。这是 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 函数不应读取/写入全局变量。