目录
一、 进程的创建。
1.1 MAC和Linux下:
import multiprocessing
def printf(name,age):
print(name,age)
#进程的创建
process1 = multiprocessing.Process(target=printf,args=('黎明',),kwargs={'age':20})
#进程的调用
process1.start()
在mac和Linux下,主进程的代码,在创建子进程的时候,不会由子进程拷贝。
1.2 Windows下:
import multiprocessing
def printf(name,age):
print(name,age)
if __name__ == '__main__':
#进程的创建
process1 = multiprocessing.Process(target=printf,args=('黎明',),kwargs={'age':20})
#进程的调用
process1.start()
Windows下,if name == ‘main’: 可以保证再导入该文件时,以下代码不执行,同时确保子进程在创建时,不会拷贝内部代码。
1.3 关于Process的说明:
Process([group [, target [, name [, args [, kwargs]]]]])
group:指定进程组,目前只能使用None
target:执行的目标任务名
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
args:以元组方式给执行任务传参
kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
二、获取进程编号
获取当前进程编号: os.getpid()
获取当前父进程编号: os.getppid()
获取进程编号可以查看父子进程的关系。
三、进程的注意点
3.1 进程之间不共享全局变量
创建子进程会对主进程资源进行拷贝,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。
import multiprocessing
import time
# 定义全局变量
g_list = list()
# 添加数据的任务
def add_data():
for i in range(5):
g_list.append(i)
print("add:", i)
time.sleep(0.2)
# 代码执行到此,说明数据添加完成
print("add_data:", g_list)
def read_data():
print("read_data", g_list)
if __name__ == '__main__':
# 创建添加数据的子进程
add_data_process = multiprocessing.Process(target=add_data)
# 创建读取数据的子进程
read_data_process = multiprocessing.Process(target=read_data)
# 启动子进程执行对应的任务
add_data_process.start()
# 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
add_data_process.join()
read_data_process.start()
print("main:", g_list)
# 总结: 多进程之间不共享全局变量
结果:
add: 0
add: 1
add: 2
add: 3
add: 4
add_data: [0, 1, 2, 3, 4]
main: []
read_data []
3.2 主进程会等待所有的子进程执行结束再结束。
不让主进程再等待子进程去执行完的两种方法:
(1)设置守护主进程方式: 子进程对象.daemon = True
(2)销毁子进程方式: 子进程对象.terminate()