python 线程 进程 协程
刚好今天早上早饭买的是煎饼果子,我就用煎饼果子这个东西来比较一些线程进程跟协程之间的关系
线程
摊一个煎饼果子,需要一个炉子,这一个炉子就相当于一个线程,摊煎饼果子就可以看成一个程序。
多线程
这家煎饼果子店又加了一个炉子,两个炉子同时开始摊饼。但是因为是在同一家店,因此面粉,水什么的都是公用,这叫资源共享。在两个炉子摊的过程中,需要往煎饼上面撒东西,老板喜欢撒上两把葱花。突然有一天,就剩下两把葱花了,但是这个时候老板跟老板娘分别在两个炉子上正在摊饼,而且都到了撒葱花的地步,老板看到还剩两把,觉得刚好够,决定继续摊饼,然而这个时候还没拿起葱花。老板娘也看到了还有两把,也决定继续摊饼。然后老板先抓了一把葱花,老板娘也抓了一把葱花,然后菜篮里面就没有葱花了,两个人这时候很尴尬,因为本来都能够摊完,但是现在不够了,没法摊了。这就是属于多线程里面的资源竞争。如果是在算钱的时候,两个人同时在算余额,也可能会出现结果混乱。因此就提出了锁的概念。就一个菜篮,老板摊饼的时候先把菜篮拿过去,然后才开始摊,老板娘只能等老板用完菜篮之后,才能把菜篮拿过来,开始她的摊饼
进程
老板有钱了,又开了一家煎饼店,然后里面有一个炉子。这个店就是一个进程
多进程
老板赚了一堆钱,然后同时开了好几家店。这就是多线程。每家店都有自己的面粉什么的,因此就不会存在资源共享。但是因为是一个老板,因此老板需要算钱,这就要求各个店之间汇报财务,这属于进程间通信
协程
老板不想开个新店,也不想开新炉子。因为每开一个新店,需要一大笔钱,还要进行采购。这属于进程的开销 。如果开个新炉子的话,还要打扫卫生,摆上一些工具什么的,这是线程开销。老板处于对自己的自信,决定在一个炉子上面干,一次给两个人A,B摊饼。他先给A摊,等到需要加热的的时候,把饼往旁边一放,开始给B摊,B摊完了然后再给A摊。虽然还是一个炉子,但是时间发生了变化。假设摊一个饼的时间是:准备1min,加热2min,撒材料1min,这样总共就是4min。开个新炉子要1min。正常摊两个病是8min,通过协程来做是1+4+1是6分钟,而多线程是4+1五分钟,而且还需要进行一部分的开销。看起来跟多线程差不多,但是协程是在一个线程里面完成的,而且不会涉及到资源竞争什么的