进程池-限制同一时间在CPU上运行的进程数

本文介绍了Python中使用多进程池(pool)进行串行及并行任务处理的方法,并详细展示了如何利用apply和apply_async函数来控制任务的执行方式。

if __name__=='__main__' :  为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用。

如果是主动执行,则执行。如果是调用的,则不执行主体。

 

1. 串行:切记切记:pool.close()必须在pool.join() 之前。

from  multiprocessing import Process,Pool
import time
import os

def Foo(i):
    time.sleep(1)
    print('in process',os.getpid())
    return i + 100

def Bar(arg):
    print('-->exec done:', arg)

if __name__=='__main__':
    pool = Pool(processes=5) #允许进程池里同时放入5个进程.虽然启用了10个,但是CPU只允许5个同时运行。其他的5个处于挂起状态。
    for i in range(10):
        #pool.apply_async(func=Foo, args=(i,), callback=Bar) #并行
        pool.apply(func=Foo, args=(i,))  #串行

    print('end')
    pool.close()
    pool.join()  # 进程池中进程执行完毕后再关闭,如果没有这句,那么程序不等进程执行完就直接关闭了。

 运行结果:

in process 13460
in process 5804
in process 8488
in process 10076
in process 12604
in process 13460
in process 5804
in process 8488
in process 10076
in process 12604
end

 2. 5个一组并行执行

from  multiprocessing import Process,Pool
import time
import os

def Foo(i):
    time.sleep(1)
    print('in process',os.getpid())
    return i + 100

def Bar(arg):
    print('-->exec done:', arg)

if __name__=='__main__':
    pool = Pool(processes=5) #允许进程池里同时放入10个进程.虽然启用了5个,但是CPU只允许5个同时运行。其它的都在挂起状态。
    for i in range(10):
        pool.apply_async(func=Foo, args=(i,), callback=Bar) #并行
        #pool.apply(func=Foo, args=(i,))  #串行

    print('end')
    pool.close()
    pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

 运行结果:

end
in process 11276
in process 8760
-->exec done: 100
-->exec done: 102
in process 12316
-->exec done: 101
in process 10916
-->exec done: 103
in process 13648
-->exec done: 104
in process 8760
-->exec done: 106
in process 11276
-->exec done: 105
in process 12316
-->exec done: 107
in process 10916
-->exec done: 108
in process 13648
-->exec done: 109

 

3. 通过进程号得知,运行callback的是主进程

from  multiprocessing import Process,Pool
import time
import os

def Foo(i):
    time.sleep(1)
    print('in process',os.getpid())
    return i + 100

def Bar(arg):
    print('-->exec done:', arg,os.getpid())

if __name__=='__main__':
    pool = Pool(processes=5) #允许进程池里同时放入10个进程.虽然启用了5个,但是CPU只允许5个同时运行。
    print("主进程",os.getpid())
    for i in range(10):
        pool.apply_async(func=Foo, args=(i,), callback=Bar) #并行callback=回调,意思是执行完func=Foo以后,再执行callback=Bar.是主进程执行的回调。
        #pool.apply(func=Foo, args=(i,))  #串行

    print('end')
    pool.close()
    pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

 

运行结果:每个进程执行完,都执行callback

主进程 5160
end
in process 15512
-->exec done: 102 5160
in process 14180
-->exec done: 100 5160
in process 15748
-->exec done: 101 5160
in process 15844
-->exec done: 103 5160
in process 13716
-->exec done: 104 5160
in process 15512
in process 14180
-->exec done: 105 5160
-->exec done: 106 5160
in process 15748
-->exec done: 107 5160
in process 15844
-->exec done: 108 5160
in process 13716
-->exec done: 109 5160

 

转载于:https://www.cnblogs.com/momo8238/p/7358969.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值