多任务的场景:1.爬取不同url的内容,爬取同一个url分页内容。比如:豆瓣图书 Top 250 https://book.douban.com/top250?start=0
实现豆瓣图书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调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。
所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。
子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。
协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
Python对协程的支持是通过generator实现的。

四、分布式进程
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。
Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。
由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

有删改,转载自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319292979766bd3285c9d6b4942a8ea9b4e9cfb48d8000

下一篇文章举例说明一下单线程异步、多线程、多进程的简单场景,并对比运行效率

多任务场景下单线程异步多线程多进程相关推荐

  1. 【Python】单线程异步多线程多进程实例

    上一篇文章主要介绍了多任务场景下单线程异步.多线程.多进程如何选择,链接:多任务场景下单线程异步多线程多进程 这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联 ...

  2. python什么时候用进程什么时候用线程_Python多线程/多进程释疑:为啥、何时、怎么用?...

    本指南的目的是解释为什么在Python中需要多线程和多处理,何时使用多线程和多处理,以及如何在程序中使用它们.作为一名人工智能研究人员,我在为我的模型准备数据时广泛使用它们! 在进入正题之前,我先讲一 ...

  3. python:一文搞懂多线程,多进程,异步协程的使用场景

    本文将使用场景化为案例,将单线程,多线程,多进程,异步协程的速度进行对比 对比速度时,   >表示 速度快于  >>表示速度远快于  =表示速度差不多 >>>> ...

  4. Python多线程多进程、异步、异常处理等高级用法

    文章目录 前言 多线程多进程 多线程 多进程 协程 总结 异步 基本概念 异步编程 asyncio aiohttp 异常 常见异常 异常处理 自定义异常 lambda表达式 lambda表达式用法 高 ...

  5. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  6. delphiXE关于线程和多线程、线程的同步与异步执行

    delphiXE关于线程和多线程.线程的同步与异步执行 一.最好的参照案例 {$BDS}\source\fmx\FMX.Helpers.Android.pas 如下四个独立方法: type   TMe ...

  7. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...

  8. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

  9. linux 进程间界面嵌套,WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)...

    WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程.然而,就不能让 ...

最新文章

  1. Nginx+Tomcat动静分离搭建
  2. 14.PTD与的基址
  3. java程序员面试经历(不忘初心,永不放弃,放得始终)。
  4. Effective C# 原则50:了解ECMA标准(译)
  5. android import找不到文件夹,android 音乐播放器找不到源文件
  6. mysql同步到另一台服务器_mysql两台服务器主从同步
  7. python两个二维数组加法_对二维数组的多个列进行Numpy平均
  8. pdf 字体和图片抽取
  9. linux 网络块存储,网络存储集群
  10. 查看Ubuntu中的ip地址
  11. 怎么去调需要登录的接口_遇到需要的登录的网站怎么办?学好python,用这3招轻松搞定...
  12. 静态代码块、构造代码块以及构造函数的加载顺序
  13. 如何自定义cad线型_百度经验.html,如何找到自己需要的CAD线型?教你怎样自定义CAD线型...
  14. mysql mpm_mysql监控工具:zabbix+MPM(Performance Monitor for MySQL)
  15. 手撸Mybatis源码-基础版
  16. 青少年CTF - Misc - 上号 Wp WriteUp
  17. 明源售楼系统技术解析(四)右键菜单
  18. 华硕无线路由打印机服务器,华硕RT-AC86U路由器怎么共享打印机
  19. OpenGL应用:天空盒子(SkyBox)
  20. 合并请求格式太乱?工单内容各写各的?表单模板来帮你

热门文章

  1. cocos creator 方法数组_基于 Cocos 游戏引擎的音视频研发探索
  2. 三个数比较大小函数调用c语言,C语言函数的调用——比较两个数的大小
  3. php字符串中单引号与双引号的区别,简单概括PHP的字符串中单引号与双引号的区别...
  4. Java 注解知识总结
  5. lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API
  6. 自定义键盘组件_一文读懂!iOS系统组件的设计规范全解
  7. python偶数分解成两个素数之和_偶数 2021218918 ,有多少种方法分解成两个素数之和?...
  8. PostgreSQL 视图、子查询
  9. 《零基础》MySQL 安装(二)
  10. 1t硬盘怎么分区最好_win7系统硬盘怎么分区 win7系统硬盘分区步骤【介绍】