之前一直没有时间梳理关于主进程和子进程的区别和联系,今天好在有空,来粗浅的谈谈,主进程和子进程的关系。
from multiprocessing import Process
import os
# 子进程
def process_():
while True:
print('hello')
print(os.getpid(), '这是子进程。。。')
if __name__ == '__main__':
p = Process(target=process_)
p.start()
# p.join()#这个是等子进程全部运行完再运行主进程
print('这是主进程。。。')
#运行结果如下:
这是主进程。。。
hello
46028 这是子进程。。。
hello
46028 这是子进程。。。
hello
46028 这是子进程。。。
。。。。
我们来看看运行结果,首先打印的是''这是主进程。。。'',这想必大家都清楚为什么,在没有p.join() 的时候会先运行主进程,后面的结果 ''hello
46028 这是子进程。。。'' 这个可以看到在主进程运行完以后,才去运行子进程,进入while Ture,不间断输出 “hello 46028 这是子进程。。。” 下面我们将p.join()这个注释打开看看运行结果。
from multiprocessing import Process
import os
# 子进程
def process_():
while True:
print('hello')
print(os.getpid(), '这是子进程。。。')
if __name__ == '__main__':
p = Process(target=process_)
p.start()
p.join()#这个是等子进程全部运行完再运行主进程
print('这是主进程。。。')
#运行结果如下:
hello
8524 这是子进程。。。
hello
8524 这是子进程。。。
hello
8524 这是子进程。。。
hello
8524 这是子进程。。。
hello
8524 这是子进程。。。
分析结果加上p.join()的时候,直接先运行的子进程里面的内容,而子进程里面又是死循环,所以'这是主进程。。。' 这句话不会打印出来。下面会改变代码观察主进程,子进程相互切换运行的情况。
from multiprocessing import Process
import os
import time
# 子进程
def process_():
while True:
print('hello')
print(os.getpid(), '这是子进程。。。')
if __name__ == '__main__':
p = Process(target=process_)
p.start()
while True:
print('这是主进程。。。')
time.sleep(1)
#运行结果如下:
这是主进程。。。
hello
45028 这是子进程。。。
hello
45028 这是子进程。。。
hello
45028 这是子进程。。。
看看结果,有一个很奇怪的现象,在主进程进入while Ture 以后,打印一次 '这是主进程。。。' 以后就跳进了子进程,进入子进程以后就一直不停循环,直到栈溢出,为什么会出现这个情况呢?我们观察一下 问题出在 time.sleep(1) 这个函数上面,time.sleep()函数会将当前进程挂起,(挂起时间取决于time.sleep(X) 这个X是多少就会挂起多少秒,)挂起后的主进程暂停运行,此时子进程会抢占资源去执行子进程,所以造成了这种奇怪的现象。为了更好地说明情况,下面我们在子进程里面也加上time.sleep()
下面看看效果:
from multiprocessing import Process
import os
import time
# 子进程
def process_():
while True:
print('hello')
print(os.getpid(), '这是子进程。。。')
time.sleep(1)
if __name__ == '__main__':
p = Process(target=process_)
p.start()
while True:
print('这是主进程。。。')
time.sleep(1)
#运行结果:
这是主进程。。。
hello
48724 这是子进程。。。
这是主进程。。。
hello
48724 这是子进程。。。
这是主进程。。。
hello
48724 这是子进程。。。
来看看这个运行结果,就一下,说明了情况,当子进程里面也加入time.sleep(1)以后,进入子进程以后,遇到time.sleep(1)子进程临时挂起,然后主进程抢占资源,继续打印'这是主进程。。。'然后再遇到time.sleep(1)切换到子进程,如此循环往复,
好啦!关于join(),主进程,子进程,的粗浅理解,希望对看文章的你有一点帮助。如有疑问欢迎私信哦!