做外贸用哪个网站好,网站备案 更名,网页配色的技巧是什么,上杭网页制作多任务的场景#xff1a;1.爬取不同url的内容#xff0c;爬取同一个url分页内容。比如#xff1a;豆瓣图书 Top 250 https://book.douban.com/top250?start0 实现豆瓣图书Top250的抓取工作#xff0c;并存入excel中#xff0c;如果采用的串行爬取方式#xff0c;每次爬完…多任务的场景1.爬取不同url的内容爬取同一个url分页内容。比如豆瓣图书 Top 250 https://book.douban.com/top250?start0 实现豆瓣图书Top250的抓取工作并存入excel中如果采用的串行爬取方式每次爬完250页都需要花费7到8分钟显然让人受不了所以必须在效率上有所提升才行。 仔细想想就可以发现其实爬10页每页25本这10页爬的先后关系是无所谓的因为写入的时候没有依赖关系各写各的所以用串行方式爬取是吃亏的。 显然可以用并发来加快速度而且由于没有同步互斥关系所以连锁都不用上到底应该选择哪种方式我们需要先了解各自的优缺点。
本人还有一篇文章是关于 同步与异步以及线程与进程
一、多线程任务和多进程任务优缺点 首先要实现多任务通常我们会设计Master-Worker模式Master负责分配任务Worker负责执行任务因此多任务环境下通常是一个Master多个Worker。 如果用多进程实现Master-Worker主进程就是Master其他进程就是Worker。 如果用多线程实现Master-Worker主线程就是Master其他线程就是Worker。 多进程模式最大的优点就是稳定性高因为一个子进程崩溃了不会影响主进程和其他子进程。当然主进程挂了所有进程就全挂了但是Master进程只负责分配任务挂掉的概率低著名的Apache最早就是采用多进程模式。 多进程模式的缺点是创建进程的代价大在Unix/Linux系统下用fork调用还行在Windows下创建进程开销巨大。另外操作系统能同时运行的进程数也是有限的在内存和CPU的限制下如果有几千个进程同时运行操作系统连调度都会成问题。 多线程模式通常比多进程快一点但是也快不到哪去而且多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃因为所有线程共享进程的内存。在Windows上如果一个线程执行的代码出了问题你经常可以看到这样的提示“该程序执行了非法操作即将关闭”其实往往是某个线程出了问题但是操作系统会强制结束整个进程。 在Windows下多线程的效率比多进程要高所以微软的IIS服务器默认采用多线程模式。由于多线程存在稳定性的问题IIS的稳定性就不如Apache。为了缓解这个问题IIS和Apache现在又有多进程多线程的混合模式真是把问题越搞越复杂。
二、计算密集型 vs. IO密集型 是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。 计算密集型任务的特点是要进行大量的计算消耗CPU资源比如计算圆周率、对视频进行高清解码等等全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成但是任务越多花在任务切换的时间就越多CPU执行任务的效率就越低所以要最高效地利用CPU计算密集型任务同时进行的数量应当等于CPU的核心数。 计算密集型任务由于主要消耗CPU资源因此代码运行效率至关重要。Python这样的脚本语言运行效率很低完全不适合计算密集型任务。对于计算密集型任务最好用C语言编写。 第二种任务的类型是IO密集型涉及到网络、磁盘IO的任务都是IO密集型任务这类任务的特点是CPU消耗很少任务的大部分时间都在等待IO操作完成因为IO的速度远远低于CPU和内存的速度。对于IO密集型任务任务越多CPU效率越高但也有一个限度。常见的大部分任务都是IO密集型任务比如Web应用。 IO密集型任务执行期间99%的时间都花在IO上花在CPU上的时间很少因此用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言完全无法提升运行效率。对于IO密集型任务最合适的语言就是开发效率最高代码量最少的语言脚本语言是首选C语言最差。
三、异步IO 考虑到CPU和IO之间巨大的速度差异一个任务在执行的过程中大部分时间都在等待IO操作单进程单线程模型会导致别的任务无法并行执行因此我们才需要多进程模型或者多线程模型来支持多任务并发执行。 现代操作系统对IO操作已经做了巨大的改进最大的特点就是支持异步IO。如果充分利用操作系统提供的异步IO支持就可以用单进程单线程模型来执行多任务这种全新的模型称为事件驱动模型Nginx就是支持异步IO的Web服务器它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上可以运行多个进程数量与CPU核心数相同充分利用多核CPU。由于系统总的进程数量十分有限因此操作系统调度非常高效。用异步IO编程模型来实现多任务是一个主要的趋势。 对应到Python语言单线程的异步编程模型称为协程有了协程的支持就可以基于事件驱动编写高效的多任务程序。 在学习异步IO模型前我们先来了解协程。 协程又称微线程纤程。英文名Coroutine。 协程的概念很早就提出来了但直到最近几年才在某些语言如Lua中得到广泛应用。 子程序或者称为函数在所有语言中都是层级调用比如A调用BB在执行过程中又调用了CC执行完毕返回B执行完毕返回最后是A执行完毕。 所以子程序调用是通过栈实现的一个线程就是执行一个子程序。 子程序调用总是一个入口一次返回调用顺序是明确的。而协程的调用和子程序不同。 协程看上去也是子程序但执行过程中在子程序内部可中断然后转而执行别的子程序在适当的时候再返回来接着执行。 注意在一个子程序中中断去执行其他子程序不是函数调用有点类似CPU的中断。 协程的特点在于是一个线程执行那和多线程比协程有何优势 最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换而是由程序自身控制因此没有线程切换的开销和多线程比线程数量越多协程的性能优势就越明显。 第二大优势就是不需要多线程的锁机制因为只有一个线程也不存在同时写变量冲突在协程中控制共享资源不加锁只需要判断状态就好了所以执行效率比多线程高很多。 因为协程是一个线程执行那怎么利用多核CPU呢最简单的方法是多进程协程既充分利用多核又充分发挥协程的高效率可获得极高的性能。 Python对协程的支持是通过generator实现的。
四、分布式进程 在Thread和Process中应当优选Process因为Process更稳定而且Process可以分布到多台机器上而Thread最多只能分布到同一台机器的多个CPU上。 Python的multiprocessing模块不但支持多进程其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者将任务分布到其他多个进程中依靠网络通信。 由于managers模块封装很好不必了解网络通信的细节就可以很容易地编写分布式多进程程序。
有删改转载自https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319292979766bd3285c9d6b4942a8ea9b4e9cfb48d8000
下一篇文章举例说明一下单线程异步、多线程、多进程的简单场景并对比运行效率