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端的资源耗尽的,很显然,还需要优化。