简单了解进程、线程、协程 - Go语言中文社区

简单了解进程、线程、协程


当单任务不能满足工作的需要,只是需要使用多任务,多任务分为多进程,多线程,多协程

先有进程,进程创建线程,线程依附于进程,线程里面包含多个协程

进程是系统资源调配的基本单位,线程是系统调度的基本单位,是代码执行的分支,协程是比线程占用资源还小的执行单元,它自带cpu的上下文,他可以在不开辟线程的基础上来实现多任务。

创建一条进程需要向操作系统索要资源,创建线程需要向对应的进程索要资源,创建协程需要向相应的线程索要资源,所以,进程最是消耗资源,其次线程,最后协程

进程之间不共享全局变量,需要靠queue队列来进行各个进程间的通信。线程间共享全局变量,但其中会出现资源竞争,这时需要使用同步方法即子进程加入主进程,或者互斥锁,在使用互斥锁时可能会出现死锁,这时我们需要对其进行手动解锁,可以使用延时或者银行家算法

进程和线程里面是无序的,主进程或者线程需要等到子进程或线程结束才会结束。如果需要主进程结束同时子进程销毁,需要加入守护主进程或主线程,协程是按照一定的顺序来交替执行,主协程不会等待子协程结束而结束,这是需要将子协程加入主协程里面

进程和协程只能实现并发,协程可以实现并行

进程创建调用muilprocessing包里面的Process模块,线程创建调用threading里面的Thread模块,协程主要是调用封装好的geven模块

进程还可以使用进程池来创建,进程池是一个用来装多个进程的容器,进程池通过multiprocessing里面的Pool来创建。当需要大批量调用进程来工作,我们可以直接调用进程池,进程池的进程数量是可控的,即可以规定多少个进程同时工作。进程池里面的进程间的通信采用multiprocessing里面manage里面的queue队列来实现。主进程不会等待进程池结束后结束,这时我们需要关闭进程池不在接收子进程,然后加入主进程

多进程稳定性强,但耗费资源太多,一般用于计算密集型。多线程运行速度一般,消耗资源比进程要小,但由于gui锁的存在,线程不是真正意义上的多任务,一般不使用;协程运行速度快,消耗资源小于线程,一般多用于爬虫,网络服务请求

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/cdc4080b185d
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:03:19
  • 阅读 ( 717 )
  • 分类:Linux

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢