python基础23 -----进程和线程
一、进程
1、什么是进程?
1.1 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。
1.2 程序是指进程需要完成那些功能以及如何完成。
1.3 数据集是指程序在执行过程中所需要使用的资源。
1.4进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用他来控制和管理进程,他是系统感知进程存在的唯
一标识
二、线程
1、为什么会有线程?
1.1线程是为了降低上下文切换的消耗,提高系统的并发性,突破一个进程只能干一件事的局限。
2、什么是线程?
2.1线程是轻量级进程,他是一个基本的cpu执行单元,也是程序执行过程中的最小单元。由线程ID,程序计数器,寄存器集合,
和堆栈共同组成。
2.2 由于线程是cpu最小的执行单元所以cpu真正执行的是线程,而进程只是管理线程,并不被cpu所执行。
· 3、线程的好处?
3.1 减少了程序并发执行的消耗,提高了操作系统的并发性能,但是线程没有自己的系统资源,是由进程分配的。
三、进程和线程的关系
1、一个线程只能属于一个进程,而一个进程可以有多个线程,但是最少必须有一个主线程。
2、系统资源分配给进程,进程下的所有线程共享分配给该进程的所有资源。
3、CPU分配给线程,即真正在cpu上运行的是线程。
四、并行和并发
1、什么是并行处理?
并行处理指的是计算机cpu同事处理两个或两个以上的线程或者说是程序。
2、什么是并发处理?
并发处理指的是计算机cpu在一段时间内能切换处理多少个进程。
3、二者之间的关系?
并行是并发的子集,并发是并行的父集。
4、补充知识点
串行:串行指的是cpu按顺序执行程序。
五、同步和异步
1、什么是同步?
同步就是指一个进程在执行某个请求时,若该请求需要一段时间才能返回信息,那么这个进程就会一直等待下去直到
接收到该请求的返回信息才会执行下面的操作。
2、什么是异步?
异步是指一个进程在执行某个请求后,若该请求需要一段时间才能返回信息,但是该进程不会等待该请求,而是直接执行下面的操作
当该请求有返回信息时操作系统会通知进程进行处理,这种异步处理的机制大大提高了程序的执行效率。
六、密集型任务
1、IO密集型任务
程序存在大量IO操作,比如说sleep,input,accert,等等。
2、计算密集型任务
程序存在大量的计算操作,除IO操作外的程序都是计算操作。
3、在多线程处理程序的情况下,IO密集型任务比计算密集型任务更有优势。
4、对应python而言,无法利用多核,因为他的进程有一个lock锁的机制,
七、补充:
1、unix和windows创建子进程的异同
相同点:不论是windows还是unix系统通过进程创建的子进程后,父进程和子进程有着各自不同的内存地址,因为他们都必须遵循多道技术 ,要求物理层面实现内存隔离,任何一个进程在其地址空间中的修改都不会影响到其他进程。
不同点:在unix中子进程的初始地址空间是父进程地址空间的一个副本(子进程和父进程是可以有只读的共享内存区),但是对于windows系统而已一开始子进程和父进程的地址空间就是不同的。
2、unix和windows进程的层次结构
相同点:论UNIX还是windows,进程只有一个父进程
不同点:UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组。在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。
3、进程的三种状态
1. 进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,这样保证CPU一直在工作
2. 与进程无关,是操作系统层面,可能会因为一个进程占用时间过多,或者优先级等原因,而调用其他的进程去使用CPU。

4、为何要用多线程
1、多线程共享一个进程的地址空间
2. 线程比进程更轻量级,线程比进程更容易创建可撤销,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用
3. 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。
4. 在多cpu系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小的多。(这一条并不适用于python)
八、线程对象
1、线程对象的创立,如图所示。

2、jion():在子线程完成运行之前,这个子线程的父线程将一直被阻塞,直到子线程完成之后,父线程才会继续进行。

3、setDeamon(True):将线程声明为守护线程。
1、将线程声明为守护线程必须在start()方法之前调用。
2、设置守护线程的原因:通常情况下当主线程程序结束后会检查他下面的子线程程序是否结束,如果子线程程序没有结束,那么
主线程会等子线程程序结束后一起退出,但是特殊情况下主线程不需要等到子线程结束后再一起退出,而是主线程程序完成后
就会自动退出,这时就用到了守护线程技术。如图所示:

4、Thread实例对象的方法
1、查看线程名:getName()
2、设置线程名:setName()
3、返回线程是否活动的:isAlive()
5、 threading模块提供的一些方法:
1、threading.currentThread(): 返回当前的线程变量。
2、threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
3、threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

python基础23 -----进程和线程的更多相关文章
- python基础之进程、线程、协程篇
一.多任务(多线程) 多线程特点:(1)线程的并发是利用cpu上下文的切换(是并发,不是并行)(2)多线程执行的顺序是无序的(3)多线程共享全局变量(4)线程是继承在进程里的,没有进程就没有线程(5) ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- 二十三. Python基础(23)--经典类和新式类
二十三. Python基础(23)--经典类和新式类 ●知识框架 ●接口类&抽象类的实现 # 接口类&抽象类的实现 #①抛出异常法 class Parent(object): ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- python基础(16)-进程&线程&协程
进程之multiprocessing模块 Process(进程) Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. 介绍 初始化参数 Process([group [, t ...
- python基础-守护进程、守护线程、守护非守护并行
守护进程 1.守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic pro ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
随机推荐
- dubbo_分布式Rpc服务
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务或Rpc服务 1.下载,编译,运行demo 1).安装zookeeper 下载:http://apache.claz.org/ ...
- java编译器特性
1.当一个表达式两边都是字面量,则编译过程中就会进行计算,并将结果生成在表达式的位置,以节省运算效率: ps:jvm认为只有是字面量时,才会对比常量池中内容:而如果是new的新对象为不同对象. 例1: ...
- std::copy ( myvector.begin(), myvector.end(), out_it )
在实际生产环境中,不能进行调试,所以程序通常需要编译一个DEBUG版本来辅助我们找出问题所在,编译这样的DEBUG版本最常用的手段就是在关键处输出我们关心一些变量的值到屏幕. 如果输出的简单的变量值, ...
- Unable to use slave's temporary directory /tmp - Can't create/write to file '/tmp/SQL_LOAD-' (Errcode: 17)
这个错误时在Mysql主从配置产生的,最后找到这个Mysql的一个bug http://bugs.mysql.com/bug.php?id=62055 bug的主要原因是:打开文件的函数中指定打开模式 ...
- code::blocks怎么设置命令行参数
Project->Set Program's Arguments...然后在相应的输入框中输入命令行参数
- socket demo程序
package cn.example.socket; import java.io.BufferedReader; import java.io.IOException; import java.io ...
- Java并发编程(十二)线程安全性的委托
在组合对象中如果每个组件都已经是线程安全的,是否需要再加一个额外的"线程安全层",需要视情况而定. final可以修饰未复制的属性,只要在静态代码块或者构造函数中赋值了即可. 独立 ...
- Cassandra第一次使用
在FreeBSD上安装Cassandra: # pkg install cassandra2找了半天Cassandra的配置文件,原来安装位置是在这: /usr/local/share/cassand ...
- Solve Equation gcd(x,y)=gcd(x+y,lcm(x,y)) gcd(x,y)=1 => gcd(x*y,x+y)=1
/** 题目:Solve Equation 链接:http://acm.hnust.edu.cn/JudgeOnline/problem.php?id=1643 //最终来源neu oj 2014新生 ...
- Git使用技巧(2)-- 基本操作
常用 Git 命令清单 作者: 阮一峰 编辑更新:shifu204 日期: 2016年9月 1日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练 ...