进程和线程究竟是什么?如何使用进程和线程?什么场景下需要使用进程和线程?协程又是什么?协程和线程的关系和区别有哪些?

程序切换-CPU时间的分配

首先,我们的任何一个程序都需要运行在一个操作系统中,如 Windows XP, RedHat Linux, FreeBSD, AIX 等;

其次,在操作系统中运行的程序,不止一个,而是成百上千个不同功能的程序,如键盘驱动,显示器驱动,HTTP服务,游戏,聊天,网页......;

最后,CPU等资源是有限的,在这成百上千个程序中,不可能每个程序都占用一个 CPU 来运行,也不可能每个程序只运行一次很短的时间;

那么如何来给应用程序分配 CPU,内存等确定数量的资源?

通过 程序切换 来实现

是指,操作系统自动为每个程序分配一些 CPU/内存/磁盘/键盘/显示器 等资源的使用时间,过期后自动切换到下一个程序。

当然,被切换的程序,如果没有执行完,它的状态会被保存起来,方便下次轮询到的时候继续执行。

实际中,这种切换很快(毫秒级),所以我们感觉不到,好像电脑能自然的同时执行多个软件。

进程

进程,就是这种“程序切换”的第一种方式。

定义

进程,是执行中的计算机程序。也就是说,每个代码在执行的时候,首先本身即是一个进程。

一个进程具有:就绪,运行,中断,僵死,结束等状态(不同操作系统不一样)。

使用

  1. 用户编写代码(代码本身是以进程运行的)

  2. 启动程序,进入进程“就绪”状态

  3. 操作系统调度资源,做“程序切换”,使得进程进入“运行”状态

  4. 结束/中断

    1. 程序执行完,则进入“结束”状态

    2. 程序未执行完,但操作系统达到“程序切换”的要求,进入“中断”状态,等待下次被调度后执行

特性

  • 每个程序,本身首先是一个进程

  • 运行中每个进程都拥有自己的地址空间、内存、数据栈及其它资源。

  • 操作系统本身自动管理着所有的进程(不需要用户代码干涉),并为这些进程合理分配可以执行时间。

  • 进程可以通过派生新的进程来执行其它任务,不过每个进程还是都拥有自己的内存和数据栈等。

  • 进程间可以通讯(发消息和数据),采用 进程间通信(IPC) 方式。

说明

  • 多个进程可以在不同的 CPU 上运行,互不干扰

  • 同一个CPU上,可以运行多个进程,由操作系统来自动分配时间片

  • 由于进程间资源不能共享,需要进程间通信,来发送数据,接受消息等

多进程,也称为“并行”。

更多信息

Linux下的进程获取

线程

线程,也是“程序切换”的一种方式。

定义

线程,是在进程中执行的代码。

一个进程下可以运行多个线程,这些线程之间共享主进程内申请的操作系统资源。

在一个进程中启动多个线程的时候,每个线程按照顺序执行。现在的操作系统中,也支持线程抢占,也就是说其它等待运行的线程,可以通过优先级,信号等方式,将运行的线程挂起,自己先运行。

使用

  1. 用户编写包含线程的程序(每个程序本身都是一个进程)

  2. 操作系统“程序切换”进入当前进程

  3. 当前进程包含了线程,则启动线程

  4. 多个线程,则按照顺序执行,除非抢占

特性

  • 线程,必须在一个存在的进程中启动运行

  • 线程使用进程获得的系统资源,不会像进程那样需要申请CPU等资源

  • 线程无法给予公平执行时间,它可以被其他线程抢占,而进程按照操作系统的设定分配执行时间

  • 每个进程中,都可以启动很多个线程

说明

多线程,也被称为”并发“执行。

更多阅读:

Linux下的线程获取方法

进程和线程的区别

一个进程中的各个线程与主进程共享相同的资源,与进程间互相独立相比,线程之间信息共享和通信更加容易(都在进程中,并且共享内存等)。

线程一般以并发执行,正是由于这种并发和数据共享机制,使多任务间的协作成为可能。

进程一般以并行执行,这种并行能使得程序能同时在多个CPU上运行;

区别于多个线程只能在进程申请到的的“时间片”内运行(一个CPU内的进程,启动了多个线程,线程调度共享这个进程的可执行时间片),进程可以真正实现程序的“同时”运行(多个CPU同时运行)。

进程和线程的常用应用场景

一般来说,在Python中编写并发程序的经验:

  1. 计算密集型任务使用多进程

  2. IO密集型(如:网络通讯)任务使用多线程,较少使用多进程.

这是由于 IO操作需要独占资源,比如:

  1. 网络通讯(微观上每次只有一个人说话,宏观上看起来像同时聊天)每次只能有一个人说话

  2. 文件读写同时只能有一个程序操作(如果两个程序同时给同一个文件写入 'a', 'b',那么到底写入文件的哪个呢?)

都需要控制资源每次只能有一个程序在使用,在多线程中,由主进程申请IO资源,多线程逐个执行,哪怕抢占了,也是逐个运行,感觉上“多线程”并发执行了。

如果多进程,除非一个进程结束,否则另外一个完全不能用,显然多进程就“浪费”资源了。

当然如上解释可能还不足够立即理解问题所在,让我们通过不断的实操来体验其中的“门道”。

协程

协程,也是”程序切换“的一种。

这里提一个特殊的“线程”,也就是协程的概念。

定义

简单说,协程也是线程,只是协程的调度并不是由操作系统调度,而是自己”协同调度“。也就是”协程是不通过操作系统调度的线程“。当然,实际要比这更复杂一些,本课程不研究协程技术,对于这个很有挑战的技术,在我们完全掌握了进程线程后,自然会理解问题渊源。

协程,又称微线程。

说明

协程的主要特色是:

协程间是协同调度的,这使得并发量数万以上的时候,协程的性能是远远高于线程。

注意这里也是“并发”,不是“并行”。

参考

Python Web学习笔记之Python多线程和多进程、协程入门的更多相关文章

  1. Python Web学习笔记之Python多线程基础

    多线程理解 多线程是多个任务同时运行的一种方式.比如一个循环中,每个循环看做一个任务,我们希望第一次循环运行还没结束时,就可以开始第二次循环,用这种方式来节省时间. python中这种同时运行的目的是 ...

  2. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

  3. python学习笔记11 ----线程、进程、协程

    进程.线程.协程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进 ...

  4. Python Web学习笔记之并发编程IO模型

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

  5. Python基础学习笔记(一)python发展史与优缺点,岗位与薪资

    相信有好多朋友们都是第一次了解python吧,可能大家也听过或接触过这个编程语言.那么到底什么是python呢?它在什么机缘巧合下诞生的呢?又为什么在短短十几年时间内就流行开来呢?就请大家带着疑问,让 ...

  6. Python+Selenium学习笔记5 - python官网的tutorial - 交互模式下的操作

    这篇笔记主要是从Python官网的Tutorial上截取下来,再加上个人理解 1. 在交互模式下,下划线'_'还可以表示上一步的计算结果 2.引号转义问题. 从下图总结的规律是,字符串里的引号如果和引 ...

  7. python学习笔记-(十四)进程&协程

    一. 进程 1. 多进程multiprocessing multiprocessing包是Python中的多进程管理包,是一个跨平台版本的多进程模块.与threading.Thread类似,它可以利用 ...

  8. Python Web学习笔记之GIL机制下的鸡肋多线程

    为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程.多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋? 有同学 ...

  9. Python Web学习笔记之为什么设计GIL

    GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发.它也是 Python 中经常讨论的话题之一. Pyth ...

随机推荐

  1. AOP与JAVA动态代理

    1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2.AOP各种实现机制 ...

  2. java内部类作用

    推荐一. 定义 放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围 ...

  3. PHP使用 zip 扩展压缩文件

    在公司遇到一个问题,是使用zip打包用户的上传文件,提供集体下载. -- 第一个想法就是使用exec在Linux进行打包.但是...exec方法吧,你懂得,我不太愿意使用这个函数. -- 于是上网查找 ...

  4. Catch---hdu3478(染色法判断是否含有奇环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问 ...

  5. mybatis之入门

    一.mybatis介绍 是apache旗下的一个开源的顶级ORM框架(做dao层的操作) 开始叫ibatis在2010年经过升级后发布到google code上就改名为mybatis 定位:1.是一个 ...

  6. Python绘图工具matplotlib的使用(图形并茂)

    matplotlib官网文档: http://matplotlib.org/gallery.html 支持win7_64_bit的matplotlib库下载网址: http://www.lfd.uci ...

  7. 便于理解mysql内幕的各种逻辑图组

    便于理解mysql内幕的各种逻辑图组 http://blog.sina.com.cn/s/blog_445e807b0101ggtl.html 以下是个人一直以来从网络等各种途径收集到的一些对理解my ...

  8. create-react-app创建react项目失败!

    create-react-app my-app 用管理员运行cmd,问题依然. 打开日志,看到错误详细信息如下 32189 verbose unlock done using C:\Users\fen ...

  9. mysql数据库的初始化及相关配置

    接着上篇文章我们继续探讨在安装完mysq数据库之后的一些相关配置: 一.mysql数据库的初始化 我们在安装完mysql数据库以后,会发现会多出一个mysqld的服务,这个就是咱们的数据库服务,我们通 ...

  10. CloudFlare CDN折腾记-优化设置

    近期又在折腾了,常访问我博客的朋友或许页面曾出现过502错误提示,那是折腾CloudFlare CDN不成功的提示.在此先感谢坛子,在他的执着和求真之下,昨天晚上终于成功使用上CloudFlare C ...