python3 multiprocessing.Pool 占用cpu不充分的问题

文章讨论了一个Python代码示例,该示例在使用multiprocessing.Pool处理大量数据时,由于数据筛选和传递导致CPU使用不充分。通过将数据筛选操作移动到任务函数内部并使用全局变量,改进了代码以避免堵塞,从而提高了CPU效率,但代价是增加了内存消耗。
摘要由CSDN通过智能技术生成

伪代码,这个是原代码的逻辑,会导致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()    # 实现进程同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值