概念
from multiprocessing import Process
1、进程常用方法
p = Process(target=函数名,args=参数, name=进程名)
#创建进程对象,执行任务 a
p.start()
#启动多进程
os.getpid()
#获取当前的进程id号
os.getppid()
#获取进程的父进程id号
multiprocessing.current_process().name
#获取当前进程名称
2、要点
默认主进程的结束不会影响子进程
3、join方法
阻塞当前进程, 直到调用join方法的那个进程执行完毕,才会向下执行(主进程等待子进程)
4、主进程一般负责任务的调度,不负责业务的调度
5、全局变量共享问题
全局变量在多个子进程中是不能共享的,在创建子进程时,对全局变量进程了备份,主进程中的全局变量和子进程中的全局变量不是同一个
6、进程池概念
from multiprocessing import Pool
实例化开启并发数
Pool([参数])
参数:开启并发数 默认是计算机的内核数
获取核心数 : multiprocessing.cpu_count()
创建子进程,放在内存池中进行管理
apply_async() 非阻塞模式 并发(异步)
apply() 阻塞模式(一个一个执行,同步)
在join之前,需要先关闭进程池,调用close以后,就不能在向进程池添加进程了
from multiprocessing import Process
from multiprocessing import Pool
import multiprocessing
import time
def fun(i):
print('子进程开始',i)
print('cpu核心数', multiprocessing.cpu_count())
time.sleep(1)
print('子进程结束')
if __name__ == '__main__':
p = Pool(8)
for i in range(8):
p.apply_async(fun, args=(i,))
p.close()
p.join()
print('over')
7、进程池map方法
概述:如果你有一堆数据要进行处理每个数据都要传递给当前的函数那么map就非常函数前提是一个可以迭代的对象
参数1 函数名
参数2 迭代对象
8、回调函数的使用
from multiprocessing import Pool
def myCallBack(x):
with open('./test.txt', 'a+') as f:
f.write(str(x))
def test(i):
return i
if __name__ == '__main__':
p = Pool()
for i in range(10):
p.apply_async(test, args=(i, ), callback=myCallBack)
p.close()
p.join()
print('over')