文章目录

  • 基本概念
  • threading线程模块

本篇开始分析Python中的并发程序,也就是进程、线程、协程序的使用。由于是用自己的语言总结的,因此比较大白话,或者叫通俗易懂。而且很多细节方面没有具体介绍,因为在Python进程管理中很少用到,这里主要分析的就是比较重要的点

基本概念

1、操作系统的本质
帮助我们控制硬件、管理软件的软件,对下提供了一个我们控制计算机的接口,对上帮助我们管理应用软件

2、早期的批处理系统
人机交互过程太多,太过浪费时间和资源,如下图:

3、解决批处理系统的问题
(1)SPOOLING技术

卡片被拿到机房后能够很快的将作业从卡片读入磁盘,于是任何时刻当一个作业结束时,操作系统就能将一个作业从磁带读出,装进空出啦的内存区域运行,这种技术叫做同时的外部设备联机操作:SPOOLING该技术同时用于输出。当采用了这种技术后,就不在需要IBM1401机了,也不必将磁带搬来搬去了(中间俩小人失业了),强化了操作系统的功能。

(2)多道程序设计,用于解决顺序执行的问题

在7094机上(程序运行的机器),若当前作业因等待磁带或等待其他IO操作而暂停,CPU就处于休闲状态直至IO操作完成,对于CPU密集的科学计算,IO操作少,浪费时间不明显,对于商业数据处理,IO等待能到达80%~90%,所以必须解决CPU浪费的现象。

4、分时操作系统
分时操作系统=多个联机终端+多道技术
由于许多程序员怀念第一代独享的计算机,可以即时调试自己的程序。为了满足程序员们很快可以得到响应,出现了分时操作系统。

20个客户端同时加载到内存,有17在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,由于客户提交的一般
都是简短的指令而且很少有耗时长的,索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机资源

5、进程的本质
(1)本质:一个程序在一个数据集上的一次动态执行过程

(2)电脑可以多个程序同时运行,如一边听着音乐,一边用QQ聊天;一个程序的运行可能有多个进程,如多个QQ同时在线,一个;我们在资源管理器里可以看到,某个软件有很多个进程。QQ进行多窗口聊天并截图。

(3)但其实它们并不是同时进行的,因为一个电脑只有一个CPU,而一个CPU不可能满足多个程序同时运行,之所以给我们看到它们是同时运行,是因为CPU处理速度太快了,可以达到纳秒(10的-9次方)级别,它运行程序时就可以瞬间切换,一会儿运行这个一会儿运行那个,当然,它们都是按照规则来运行。虽然一直在切换,由于速度特别快,因此给我们感觉是CPU在同时运行多个程序,一种并发效果。

(4)不过,虽然它能达到一种并发运行程序的效果,但是这也是有极限的,这就是为什么当我们运行的程序太多的时候就会出现卡顿的原因之一。到现在,我们已经有了双核、四核、八核CPU,就相当于有多个CPU同时转,让我们的电脑或手机更加流畅,说白了就是我们更加无法察觉出它运行程序的瞬间切换。

6、线程的本质
(1)本质:线程是进程的一个最小执行单元,进程之下有多个线程,一个进程至少有一个线程。

(2)如某个软件下有多个功能,而我们运行某一项功能就是打开一个线程,而该软件运行着,就是一个大的进程。如在QQ里面边聊天,同时接受邮件,同时使用截图。

(3)进程与线程的区别:进程是最小的资源单位,系统分配内存是分给进程的;线程是最小的执行单元,但不可能只有线程存在,因为它需要进程的资源这个前提。

threading线程模块

1、开三个线程
(1)参考代码:

import threading  #导入线程模块
import timedef Hi(num):print('hello python %d\n' %num)time.sleep(3)  #睡3秒if __name__ == '__main__':t1 = threading.Thread(target=Hi,args=(10,))#实例化一个线程对象;传入一个函数名,不能加();再传入函数需要的参数到args中t1.start()  #启动一个线程对象t1 = threading.Thread(target=Hi,args=(9,))  #线程二t1.start()  #启动一个线程对象print('运行结束!')

(2)运行原理:

(3)参考结果:

2、线程对象的 join 方法
就是等待效果,对子线程使用
(1)不加join的情况:

import threading
import timedef game():print('%s开始玩游戏...' %time.ctime())time.sleep(3)print('%s结束停止玩游戏。' %time.ctime())def music():print('\n%s开始播放音乐...'%time.ctime())time.sleep(5)print('%s结束播放音乐。' %time.ctime())if __name__ == '__main__':t1 = threading.Thread(target=game)  #实例化线程对象t1.start()  #执行线程对象t2 = threading.Thread(target=music)  #实例化线程对象t2.start()  #执行线程对象#效果:开始玩游戏、开始播放音乐、程序结束先出来;#再停顿3秒,出停止玩游戏,再停2秒,出结束播放,程序一共执行5秒print('\n程序结束!')

(2)不加join结果:

(3)将if name == ‘main’:的内容换成以下:

if __name__ == '__main__':t1 = threading.Thread(target=game)  #实例化线程对象t1.start()  #执行线程对象t2 = threading.Thread(target=music)  #实例化线程对象t2.start()  #执行线程对象t1.join()  #加了一个join就会按照顺序来执行,等子线程执行完了再回到主线程#t2.join()print('\n程序结束!')

(4)加join的结果:

(5)若将join处的语句改成

t1.join()  #加了一个join就会按照顺序来执行,等子线程执行完了再回到主线程
#t2.join()

则会先出两个开始,睡3秒,再出停止游戏,和程序结束,等2秒,出接收播放音乐

3、继承式调用

import threading
import timeclass MyThread(threading.Thread):def __init__(self,num):threading.Thread.__init__(self)self.num = numdef run(self):#定义每个线程要运行的函数print("running on number:%s" %self.num)time.sleep(3)if __name__ == '__main__':t1 = MyThread(1)t2 = MyThread(2)t1.start()t2.start()print("ending......")


继承式调用的用处并不大,也非常少用到,这里只简单介绍一下

4、setDamen()守护线程
将子线程跟随主线程的结束而结束,就是一旦回到主线程,子线程的后续动作都不会执行了一定要放在start之前用
参考代码:

import threading
import timethreads = []  #用来装子线程的空列表def game():print('\n%s开始玩游戏...' %time.ctime())time.sleep(3)print('%s结束停止玩游戏。' %time.ctime())def prograss():print('\n%s start to write prograss...' %time.ctime())time.sleep(5)print('%s finish to write prograss.' %time.ctime())#实例化2个线程对象
t1 = threading.Thread(target=game)
t2 = threading.Thread(target=prograss)#追加2个对象到列表中
threads.append(t1)
threads.append(t2)if __name__ == '__main__':t1.setDaemon(True)for t in threads:#t.setDaemon(True)  #必须放在start之前t.start()print('\n程序结束!%s' %time.ctime())

5、threading下的其他方法

run(): 线程被cpu调度后自动执行线程对象的run方法

start(): 启动线程活动

isAlive(): 返回线程是否活动的

getName(): 返回线程名

setName(): 设置线程名

threading.currentThread(): 返回当前的线程变量

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果

Python之进程+线程+协程(进程的本质 与 threading线程模块)相关推荐

  1. python线程协程进程的区别_进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区 ...

  2. Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...

  3. 教你打开线程、进程和协程的大门!

    作者 | 蓝  责编 | 张文 头图 | CSDN 下载自视觉中国 不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没 ...

  4. python的进程线程和协程_python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

  5. 【转载】Python线程、进程和协程详解

    从操作系统角度 操作系统处理任务,调度单位是进程和线程. 进程:表示一个程序的执行活动(打开程序.读写程序数据.关闭程序) 线程:执行某个程序时,该进程调度的最小执行单位(执行功能1,执行功能2) 一 ...

  6. python 进程 线程 协程

    并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...

  7. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  8. python线程、进程、协程

    进程与线程之间的定义 计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是 ...

  9. 〖Python〗-- 线程、进程、协程

    [线程.进程.协程] 学习进程.线程.协程,引申一些内容 为什么要学习进程和线程: 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支 ...

  10. 【黑马-python进阶】---学习笔记(7)---线程、进程、协程、正则表达式

    4 多任务-线程 4.1 多任务介绍 目标 知道多任务概念 多任务和单任务程序的区别 1.多任务解析 操作系统可以同时运行多个任务,现在,多核CPU已经非常普及,但是,即使过去的单核CPU,也可以执行 ...

最新文章

  1. 解决异方差问题--加权最小二乘法
  2. 软件工程方法论对我们开发软件有多大用处?谈谈你的看法。
  3. 用Python画中国地图(二)
  4. JWT –生成和验证令牌–示例
  5. 启动代码格式:nginx安装目录地址 -c nginx配置文件地址
  6. 面板大小调整_3天学会premiere完全自学教程-更改剪辑大小
  7. Git最全操作流程,抓紧收藏吧朋友,真实用
  8. Python 每日一记1启程
  9. 域名交易的信息差,原来还可以这样赚钱
  10. 终结符与非终结符详述
  11. java 电子栅栏,Java Exchanger栅栏
  12. 优化TCP/IP,HTTP,Https,Socket,websocket,弱网及网络协议(概念)
  13. 切比雪夫阻抗变换器设计与仿真
  14. 谷歌高效开发的秘密:来自谷歌前员工的软件开发工具指南
  15. 怎样黑进Microsoft:循序渐进指南 (转)
  16. mysql多字段in用法
  17. IPSec虚拟专用网原理及基础配置实例
  18. 【Linux】Linux知识点汇总
  19. 安卓APP源码和设计报告——快递查询录入系统
  20. C语言实现写入注册表,简单的开机自启动

热门文章

  1. FinalShell SSH工具下载
  2. python第一单元测试,知到Python语言应用第一单元章节测试答案
  3. php毛玻璃,毛玻璃的性质及功能特点
  4. php怎么连接数据库6,PHP连接数据库的步骤
  5. 显示客户端接收什么服务器,什么是显示服务器,用来做什么?
  6. 微型计算机通信与接口技术 pdf,微机原理与接口技术 pdf
  7. 在linux下运行qiime,科学网—QIIME2在Linux环境下使用遇到的问题 - 肖斌的博文
  8. java map原理_Java HashMap底层原理分析
  9. thymeleaf的属性优先级
  10. C# 序列号和反序列化