一 源码剖析
# Process 部分源码
class Process(process.BaseProcess):
_start_method = None
@staticmethod
def _Popen(process_obj):
return _default_context.get_context().Process._Popen(process_obj)
# process.BaseProcess 部分源码
class BaseProcess(object):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
*, daemon=None):
从源码可以看出,传参可以是元组args=()
,也可以是字典kwargs={}
参数介绍:
group参数未使用,值始终为None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'egon',)
kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
name为子进程的名称
二 开启子进程的两种方式
创建对象方式
# 方式一:对象方式
from multiprocessing import Process
import time
def task(name):
print('%s is running' % name)
time.sleep(3)
print('%s is done' % name)
if __name__ == '__main__':
# Process(target=task,kwargs={'name':'子进程1'})
p = Process(target=task, args=('子进程1',))
p.start() # 仅仅只是给操作系统发送了一个信号
print('主')
类继承方式
# 方式二
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s is running' % self.name)
time.sleep(3)
print('%s is done' % self.name)
if __name__ == '__main__':
p = MyProcess('子进程1')
p.start() # 自动调用run()
print('主')
三 总结
程序默认有一个主进程
,通过multiprocessing
模块创建了一个子进程后,此时进程总数为2