当主进程开启子进程后,主进程会与子进程并行执行。当主进程执行后不会立马结束进程,而是会等子进程结束才结束,好去清理僵尸子进程(给子进程收尸)。
进程之间内存是相互隔离的。当创建子进程时,会把父进程的内存空间拷贝一份到子进程,子进程的改变不会影响主进程的内存空间。
但进程之间的IO是共享的,可以同时操作同一个文件或终端。
第一种方式:
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__':
p = Process(target=task, kwargs={'name': '子进程1'})
# p = Process(target=task, args=('子进程1',))
p.start() # 仅仅只是给操作系统发送了一个信号,然后继续往下执行,不会等待子进程执行完成。但是会等子进程结束后,能结束主进程。
print('主')
#会执行子进程执行结束后,才结束自己进程。
# 输出结果:
# 主
# 子进程1 is running
# 子进程1 is done
第二种方式: 继承的方式
from multiprocessing import Process
import time
class MyProcess(Process): # 继承Process类
def __init__(self, name):
super().__init__()
self.name = name
def run(self): # 必须重写run方法
print('subprocess starting %s' % self.name)
time.sleep(3)
print('end subprocess %s' % self.name)
if __name__ == '__main__':
p = MyProcess('xxx')
p.start() # start自动绑定到run方法
print('主线程')
# 输出结果:
# 主线程
# subprocess starting xxx
# end subprocess xxx
进程之间,内存空间是相互隔离的:
from multiprocessing import Process n = 100 # 在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了 def work(): global n n = 0 print('子进程内: ', n) if __name__ == '__main__': p = Process(target=work) p.start() p.join() print('主进程内: ', n)
输出:
子进程内: 0
主进程内: 100