美文网首页
python 进程的理解(主进程和子进程)

python 进程的理解(主进程和子进程)

作者: xu一直在路上 | 来源:发表于2019-03-11 15:45 被阅读0次

之前一直没有时间梳理关于主进程和子进程的区别和联系,今天好在有空,来粗浅的谈谈,主进程和子进程的关系。

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(),主进程,子进程,的粗浅理解,希望对看文章的你有一点帮助。如有疑问欢迎私信哦!

相关文章

  • python 进程的理解(主进程和子进程)

    之前一直没有时间梳理关于主进程和子进程的区别和联系,今天好在有空,来粗浅的谈谈,主进程和子进程的关系。 我们来看看...

  • python进程

    python开启进程 父进程和子进程都会从fork()函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是...

  • python 多进程 多线程 协程

    一、多进程 1、子进程(subprocess包) 在python中,通过subprocess包,fork一个子进程...

  • Linux回收子进程

    孤儿进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程...

  • mac 安装配置supervisor

    supervisor 管理进程用的, 公司线上的进程管理就是supervisor.python 写的 , 子进程中...

  • Python札记52_进程和线程2

    在之前的札记Python札记50_进程和线程1中介绍了进程、线程和子进程以及多进程的相关知识,本札记中重点介绍多线...

  • 多进程

    多进程简单理解: 进程之间是独立的,是操作系统自己来维护和管理的,python通过C接口起了一个进程,多进程可以充...

  • python类库[进程subprocess与管道pipe]

    python类库[进程subprocess与管道pipe] - CSDN博客 python子进程模块subproc...

  • 如何理解单线程、多线程?如何选择多线程、多进程?

    在进入主题之前,我们先要理解一些名词。 进程 线程 主进程 子进程 主线程 子线程 名词理解 进程 当一个程序被运...

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

网友评论

      本文标题:python 进程的理解(主进程和子进程)

      本文链接:https://www.haomeiwen.com/subject/tvcbpqtx.html