python-Process创建进程时给函数传递参数

概述

本文讲解创建进程时给函数传递参数

将参数放入到 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()))

执行结果如下:

在子进程中,修改了了主进程传递的参数,但是在主进程中的变量并没有变化,原因是:
给子进程传递的参数,是对主进程中变量的拷贝,将 拷贝 传递过去了

注意:
由于拷贝主进程的变量,所以在进行多进程开发时,比较 消耗内存


原文出处:/show_1EF3OHfKyK9s.html