Python 多进程使用

1. 进程池

1.1 进程池串行-apply

apply从进程池里取进程,然后一个一个执行,第一个进程执行完,第二个进程才执行,进程之间是串行的操作。这样就不是并发操作,没有太大意义。

 
from multiprocessing import Pool

def f1(arg):
    print(arg)
if __name__ == "__main__":
    pool = Pool(5)

    for i in range(10):
        pool.apply(func=f1,args=(i,))   # apply执行函数,传入参数
    print('end')

 

 

 

'''
打印:
0
1
2
3
4
5
6
7
8
9
end
'''

 

1.2 进程池异步-apply_rsync

from multiprocessing import Pool

def f1(arg):
    print(arg)
if __name__ == "__main__":
    pool = Pool(5)

    for i in range(10):
        # pool.apply(func=f1,args=(i,))   # apply执行函数,传入参数
        pool.apply_async(func=f1,args=(i,))
    print('end')
 
'''
打印:
end
'''

这10个任务kua一下全执行了,主进程执行到end了。
主进程执行完了,子进程就被终止掉了。
主进程执行完了,就不再等子线程了,如果要等就要设置参数。
多线程线程默认也是,主进程不等子进程,多线程是:daemon=True加join来让他等。

join是终止进程,必须要前面执行close或者terminate方法。

执行close,等所有任务(10个)全部执行完,再终止

执行terminate,表示立即终止,不管你当前的任务是否执行完,都立即终止。

 

from multiprocessing import Pool
import time


def f1(arg):
    time.sleep(1)   # 加这句是为了看出5个5个执行的效果。
    print(arg)
if __name__ == "__main__":
    pool = Pool(5)

    for i in range(10):
        # pool.apply(func=f1,args=(i,))   # apply执行函数,传入参数
        pool.apply_async(func=f1,args=(i,))
    pool.close()
    pool.join()     # join表示:主进程执行到这里的时候,夯住了,等子进程结束的时候,再往下执行。
    print('end')

 

光执行join,会触发下面的断言错误:
assert self._state in (CLOSE, TERMINATE)
join源代码有这句,只有符合这个条件的,才不会报错。
这个条件就是:执行join之前,必须执行close或者terminate方法。
close+join:是等子线程全部执行完了,才继续往下执行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值