并发编程之多进程二

1>join方法

    1.1>join方法

        join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步

    1.2>什么场景下要用join方法

        1.1.1>主进程与子进程相互独立,主进程执行完,还得等待子进程执行完毕,才能回收资源

        1.1.2>主进程执行到某已阶段,需要子进程执行完毕才能继续执行,此时就需要一种机制,保证子进程执行完毕再执行

        主进程,否则主进程就一直阻塞。

    1.3>join基本用法

    

    1.4>join方法究竟让程序并发还是串行研究

    

    为何如此?开始p.start()提交并发任务后,系统中已经有三个并发的进程了,各个子进程都有p.join(),

    要记住:join()方法是让主进程等,所以并不影响子进程‘同步’运行,等到耗时最长的子进程p.join()都执行完毕

    的话,其他子进程肯定也早就结束了,所以程序耗时就约等于耗时最长的程序的运行时间。

    1.5>Process的其他方法

        1.5.1> is_alive:程序还在执行则返回True,否则返回False

        

        1.5.2>name与pid

        

2>守护进程

    若是主进程执行完毕,子进程没有存在的意义,则可以设置成守护进程,----设置成守护进程主要还是能让系统快速回收被占用的资源,因为当一个子进程结束后,程序不会马上回收他的内存空间,他的pid等信息都会继续保留一段时间,而设置成守护进程后,当主进程执行完毕,子进程不管当前状态如何都将随之终止,并释放所有占据的资源。

    2.1>未设置守护进程时

    

    2.2>设置守护进程时

    

3>互斥锁

    进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如下

    

    3.2>引入互斥锁

    

    所以互斥锁的原理,就是把并发改成穿行,降低了效率,但保证了数据安全不错乱。

4>补充:基于多进程实现并发的套接字通信

    4.1>先回顾下之前单个server对接多个client时的处理方式

    

    4.2>引入多进程时,效果如下

    

    

phone.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

    允许ip和端口被重复使用

    其实这样写还有一个问题:server这边只要有客户接入,就建立连接并且开启子进程与之交互,因server端是无法预估究竟

    有多少client接入,当开启的子进程数达到一定数量时,是会把server端的资源耗尽的,很显然,还需要优化。

猜你喜欢

转载自blog.csdn.net/huangql517/article/details/80074172