进程,线程,协程如何配合可以发挥最大的效率

查看 106|回复 7
作者:shrugginG   
自己对于进程,线程,协程的理解总是一知半解,导致每次用到的时候就查一次相关的资料,无法记忆深刻。
目前的场景是需要使用 playwright 对大量的网站进程动态爬虫,所以想考虑使用进程,线程与协程三者之间两两配合(甚至三者同时使用)来实现最大的效率,不知道该如何下手。
其实我更需要的是通过一次学习彻底建立对于进程,线程与协程的深刻理解,这样才能在面对具体问题时具体分析,所以也想让大家推荐一些书籍(或者学习材料都可以,我猜可能是《深入理解操作系统》方面的知识?)来建立对于进程,线程以及协程的知识体系

协程, 进程, 线程, 理解

huyomi   
cpu 密集型任务用多线程。
io 密集型任务用 单线程基于事件并发(也就是协程),
如果混合,则主要线程用单线程基于事件并发,用线程池去把 cpu 密集型任务转成异步任务。
一般不会用多进程,python 用多进程的原因是因为有 GIL 锁
书籍建议你看 操作系统导论 ,就看第一部分 虚拟化(第一部分分为 cpu 虚拟化和内存虚拟化,看 cpu 的就行了) 和第二部分 并发 (基于线程并发,基于事件并发),
fregie   
不解释原理了,你这种场景直接无脑协程就行了,上下文切换开销最小
当然你要是想更小开销,直接固定线程数 epoll 循环监听 socket,但是我觉得没什么必要
shrugginG
OP
  
@huyomi 谢谢解答。那我是不是可以理解为其实目前多进程的应用已经不多了,python 那边还有应用的原因是 GIL 的存在呢。
shrugginG
OP
  
@fregie 其实我有一个设想是,单线程(协程)执行任务的话是没法利用多核 CPU 的。我设想了两种方案:一是在开多进程然后每个进程中一个线程(协程);或者是在单进程中开多线程,每个线程都是协程。我不太确定这样的话能不能比一个线程(协程)更加高效呢
Jony4Fun   
@shrugginG #4 像 golang 里的 GMP 模型,默认就是把 M ,也就是线程的数量,设置为核心数,然后所有协程在这些线程中调度。协程调度的算法也会影响效率。正常来说两个核心干活,如果活足够多,那肯定是两个核心更高效。如果各自协作不好,就另说了。
fregie   
协程的设计都是基于多线程的,能直接利用多核 cpu
比如在 8 核 cpu 的机器上会开 8 个线程(实际可能会更多些),在这 8 个线程上调度一大堆协程,能完全利用起 cpu 资源
Jony4Fun   
@shrugginG #4 还是要看你的任务类型,CPU 用得多还是 IO 多,爬虫的话应该是 IO 密集的吧,可以先测一测当前程序的瓶颈是啥。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部