一 源码剖析

  1. # Process 部分源码
  2. class Process(process.BaseProcess):
  3. _start_method = None
  4. @staticmethod
  5. def _Popen(process_obj):
  6. return _default_context.get_context().Process._Popen(process_obj)
  1. # process.BaseProcess 部分源码
  2. class BaseProcess(object):
  3. def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
  4. *, daemon=None):

从源码可以看出,传参可以是元组args=(),也可以是字典kwargs={}

参数介绍:

  1. group参数未使用,值始终为None
  2. target表示调用对象,即子进程要执行的任务
  3. args表示调用对象的位置参数元组,args=(1,2,'egon',)
  4. kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
  5. name为子进程的名称

二 开启子进程的两种方式

创建对象方式

  1. # 方式一:对象方式
  2. from multiprocessing import Process
  3. import time
  4. def task(name):
  5. print('%s is running' % name)
  6. time.sleep(3)
  7. print('%s is done' % name)
  8. if __name__ == '__main__':
  9. # Process(target=task,kwargs={'name':'子进程1'})
  10. p = Process(target=task, args=('子进程1',))
  11. p.start() # 仅仅只是给操作系统发送了一个信号
  12. print('主')

类继承方式

  1. # 方式二
  2. from multiprocessing import Process
  3. import time
  4. class MyProcess(Process):
  5. def __init__(self, name):
  6. super().__init__()
  7. self.name = name
  8. def run(self):
  9. print('%s is running' % self.name)
  10. time.sleep(3)
  11. print('%s is done' % self.name)
  12. if __name__ == '__main__':
  13. p = MyProcess('子进程1')
  14. p.start() # 自动调用run()
  15. print('主')

多进程.gif

三 总结

程序默认有一个主进程,通过multiprocessing模块创建了一个子进程后,此时进程总数为2