概述
本文讲解创建进程时给函数传递参数
将参数放入到 args 中
from multiprocessing import Process
def task(name,age,hobby):
print('子进程开始')
print('子进程--参数:name=',name)
print('子进程--参数:age=',age)
print('子进程--参数:hobby=',hobby)
print('子进程结束')
if __name__ == "__main__":
print('主进程开始')
'''
传值,将参数放入到 args中,args是元组类型
李雷传入到 task函数的name形参中
20传入到 task函数的age形参中
'''
p=Process(target = task,args = ('李雷',20,['王者荣耀','刷抖音']))
#启动子进程
p.start()
print('主进程结束')
将字典参数赋值给 kwargs
from multiprocessing import Process
def task(name,age):
print('子进程开始')
print('子进程--参数:name=',name)
print('子进程--参数:age=',age)
print('子进程结束')
if __name__ == "__main__":
print('主进程开始')
'''
将值放入 字典类型中,key必须与 task() 函数中的形参名相同。如果不相同会报错
将字典类型的参数,赋值给 kwargs
执行时:
李雷传入到 task函数的name形参中
20传入到 task函数的age形参中
'''
info = {
'name':'李雷',
'age':20
}
p=Process(target = task,kwargs = info)
#启动子进程
p.start()
print('主进程结束')
其他传值方法
创建进程时传递参数:
import time
from multiprocessing import Process
import os
#打印进程id,父进程id
print('文件开始---,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
def fun(*args,**kwargs):
print('子进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
print('子进程--',type(args),type(kwargs))
print('子进程--传递数据:args=',args)
print('子进程--传递数据:kwargs=',kwargs)
print('子进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
if __name__ == "__main__":
#打印进程id
print('主进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
d={'name':'李雷'}
#创建进程,设置进程名字,并且传值
p=Process(target=fun,name='myprocess',args=(1,),kwargs=d)
#启动进程
p.start()
#子进程pid和name
print('主进程---子进程pid=%d,name=%s'%(p.pid,p.name))
print('主进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
说明:
- 第8行,定义函数时指定形参
- 第9行,打印形参类型
- 第10行,打印参数的值
- 第19行,创建进程时给函数传递参数
给子进程传递的参数是对原变量的拷贝
import time,os
from multiprocessing import Process
#打印进程id,父进程id
print('文件开始---,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
def fun(*args,**kwargs):
print('子进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
print('子进程--',type(args),type(kwargs))
print('子进程--传递数据:args=',args)
print('子进程--传递数据:kwargs=',kwargs)
kwargs['age']=20
print('子进程--修改kwargs数据后,kwargs=',kwargs)
print('子进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
if __name__ == "__main__":
#打印进程id
print('主进程开始,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
d={'name':'李雷'}
#创建进程,设置进程名字,并且传值
p=Process(target=fun,name='myprocess',args=(1,),kwargs=d)
#启动进程
p.start()
#让父进程休眠2秒
time.sleep(2)
print('主进程--d=',d)
#子进程pid和name
print('主进程--子进程pid=%d,name=%s'%(p.pid,p.name))
print('主进程结束,pid=%d,ppid=%d'%(os.getpid(),os.getppid()))
执行结果如下:
在子进程中,修改了了主进程传递的参数,但是在主进程中的变量并没有变化,原因是:
给子进程传递的参数,是对主进程中变量的拷贝,将 拷贝 传递过去了
注意:
由于拷贝主进程的变量,所以在进行多进程开发时,比较 消耗内存