伪代码,这个是原代码的逻辑,会导致cpu使用不充分
from multiprocessing import Pool
import pandas as pd
fks = pd.read_csv('一个3G左右的csv文件')
def task(fks_as):
'''
代码块
'''
print(fks_as)
if __name__ == '__main__':
ppool = Pool(pool_num)
for i in range(0,100000):
# 主要是这里占用时间
# 1,fks的筛选需要时间,大概2秒左右
# 2,筛选出的数据再传给task进程,也需要时间
# 所以,这里会有堵塞,导致cpu使用不充分
fks_as = fks[(fks['Datetime'] >= first_time) & (fks['Datetime'] < current_time)]
ppool.apply_async(task, args=(fks_as,))
ppool.close() # 结束向进程池中添加任务(后续不能再使用apply_async方法添加新任务)
ppool.join() # 实现进程同步
改成下面这样就好了,代价就是需要的内存会增加很多
from multiprocessing import Pool
import pandas as pd
def task(first_time,current_time):
# 筛选移到这里,因为每个进程都有fks变量,所以内存会增加
fks_as = fks[(fks['Datetime'] >= first_time) & (fks['Datetime'] < current_time)]
'''
代码块
'''
print(fks_as)
def initfks(fks_):
global fks
fks = fks_
if __name__ == '__main__':
fks = pd.read_csv('一个3G左右的csv文件')
# 把fks设置全局变量,进程池中的所有进程,都可以访问
ppool = Pool(pool_num,initializer=initfks, initargs=(fks,))
for i in range(0,100000):
# 之前的 筛选 挪走了,数据也不在这里传了,所以这里不会再有堵塞,进程池的所有进程都可以一起工作了
ppool.apply_async(task, args=(first_time,current_time))
ppool.close() # 结束向进程池中添加任务(后续不能再使用apply_async方法添加新任务)
ppool.join() # 实现进程同步