加入控制子过程
让让我们举一个例子:
在最后10封邮件发出后,我想等待所有子进程运行后再打印,但从运行结果来看,这并没有达到我们的预期,因为父进程和子进程是异步的。
聪明的小明问:为什么不我为什么不让程序在最后一条打印语句前休眠呢?
很聪明,但是治标不治本。这只会让程序进入休眠状态,但它不会不能从根本上解决异步的问题。它们仍然是异步的,但只是对睡眠异步。
这时,我们可以使用join()方法:
获取以下各项的运行结果:
原则:
join()方法的意思是给进程添加一个块,也就是进程会在这里停止运行。在再次使用join方法之前,for循环会同时创建这10个进程,但是在使用join方法之后,循环必须依次执行,因为第一个创建的进程在到达join()时会阻塞,join方法直到第一个进程完成才会释放阻塞,开始第二个循环,以此类推十次。
但是:
从根本上说,join方法帮助我们将异步转化为同步。虽然可以更有序,但并没有增加我的效率。异步同时执行仍然是需要的,因为它可以节省时间。但是join方法同步异步编程后,拖累了工作效率。
当然,也有解决方案:
将所有进程添加到列表中。当流程开始时,它仍然是异步的。只有当最后所有的块都被抬起时,主程序才能被执行。
守护进程
Daemon是一种在后台运行的特殊进程,不受任何终端控制。用于执行特定的系统任务。许多守护进程在系统启动时启动,并一直运行到系统关闭。还有的只在需要的时候启动,任务完成后自动结束。守护进程最重要的特性是它们在后台运行。
换句话说,守护进程将随着主进程代码的执行而结束。
让让我们看另一段:
效果是一样的,只不过多了一个func2,这里只有func1是守护进程。所以守护进程在主进程代码完成时结束,func2不是守护进程,可以继续运行。
也许小明会很困惑。守护进程有什么用?事实上,这个守护程序可以作为一个程序,每隔一段时间就向一台机器报告它的状态,它赢了它死的时候不要报告。(让let’先这么理解吧)
进程锁-锁
锁,什么是锁锁?让让我们用一个直观的例子。
让构建一个json文件模拟抢票。没错,就是抢票:
创建一个json文件
{'伯爵2} #表示边距为2。
实现抢票
明明只有两张票,但是他们都拿到了。
但如果仔细看,其实json文件中的数据只被修改过一次。因为这是一个异步程序,五个用户同时打开读取json文件的内容,也就是说数据修改是外部的,而不是在json文件中。只要他们同时打开并阅读,这五个用户阅读的内容是相同的。伯爵2}一开始,五个用户都在外面修改数据,然后保存回来,也就是五个用户保存的数据都是{ 伯爵
所以我们可以用加锁的方法(互斥,这里是进程的互斥,线程也有锁)。互斥锁是一种简单的锁定方法,用于控制对共享资源的访问。互斥锁只有两种状态,锁定和解锁。原则是:
解锁后,用户可以一起涌入数据文件,修改数据文件中的信息。但是,当它被锁定时,只有一个通道可以访问数据文件。虽然所有人同时发起访问,但是只能有一个用户进入数据文件,然后这个用户完成修改退出文件后,通道就会对其他用户开放。程序是异步的,但是只限制了数据修改过程中的流程。
这使得异步程序达到了同步的效果。旗语-旗语
互斥锁只允许一个进程同时修改数据,信号量允许多人同时修改数据。互斥锁相当于你的厕所,只有一个坑,同一时间只能有一个人上厕所;旗语相当于一个公共厕所,有多个坑,可以多人同时上厕所。比如现在有10个人需要上厕所,现在公厕只有三个坑。这时候三个人先上厕所,等其中一个或几个出来后,其他人才能进去。
Semaphore管理一个内置计数器,每当调用acquire()时,内置计数器为-1;调用release()时内置计数器1;计数器不能小于0;当计数器为0时,acquire()将阻塞该进程,直到其他进程调用release()
事件-事件
另一个红灯停止绿灯:
审计刘清
标签:进程程序方法