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

程序切换-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. POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]

    嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...

  2. 基于Docker部署nodejs应用

    基于Docker部署nodejs应用 背景 公司基于Vue.js的项目最近需要部署到云端,因此需要先行在公司内部Docker环境下验证相关技术,因而有本文之前提. 本文展示在Docker容器中,应用部 ...

  3. DDOS hulk,rudy

    HULK (HTTP Unbearable Load King) HULK HULK是另一个DOS攻击工具,这个工具使用UserAgent的伪造,来避免攻击检测,可以通过启动500线程对目标发起高频率 ...

  4. Balls and Boxes---hdu5810(推公式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5810 有n个球m个盒子,随机把球放到盒子中,求每个盒子球个数的方差的期望值 E[V]; 推公式吧,或者 ...

  5. Eclipse+Pydev 搭建开发环境(转)

    add by zhj: 对原文略有修改 原文:http://www.cnblogs.com/TankXiao/archive/2013/05/29/3033640.html C#之所以容易让人感兴趣, ...

  6. PULL解析学习

    学习过程   安卓中有三种对XML解析的方式,这个众所周知,DOM,SAX,PULL 其中被推荐的方法是PULL,说是非常简单,但从一开始接触就觉得比较迷惑,总是云里雾里的感觉,甚至在自己写出了一个能 ...

  7. oracle(九)索引扫描

    (1)索引唯一扫描(index unique scan) (2)索引范围扫描(index range scan) (3)索引全扫描(index full scan) (4)索引快速扫描(index f ...

  8. Linux输入输出重定向和文件查找值grep命令

    Linux输入输出重定向和文件查找值grep命令 一.文件描述符Linux 的shell命令,可以通过文件描述符来引用一些文件,通常使用到的文件描述符为0,1,2.Linux系统实际上有12个文件描述 ...

  9. vue:Group XSwitch Actionsheet,Toast控件使用

    <template> <div> <div class="vux-demo"> <img class="logo" s ...

  10. java list map用法

    1.初始化,方法1 //初始化List List<string> list = new ArrayList</string><string>(); list.add ...