python多线程

python 并发编程基础之 线程

醉酒当歌 提交于 2019-12-02 00:25:23
目录 进程互斥锁: 队列:先进先出 堆栈:先进后出 ICP: 进程间通信 线程: 什么是线程 为什么要使用线程 线程的两种创建方式: 线程互斥锁: 进程互斥锁: ​ from multiprocessing import Lock ​ 让并发变成串行,牺牲了执行效率,保证了数据安全。 ​ 在程序并发执行时,需要修改数据时使用。 模拟抢票实例: data: "ticket_num":3 代码: import json import time from multiprocessing import Process from multiprocessing import Lock def search(user): # 查看余票功能 with open('data.txt', 'r', encoding='utf8') as f: # 打开数据文件 dic = json.load(f) print(f'用户{user}查看余票,还剩{dic.get("ticket_num")}张') def buy(user): # 余票数据修改功能 with open('data.txt', 'r', encoding='utf8')as f: # 再次打开是为了打开最新数据 dic = json.load(f) # 拿到车票相关数据 time.sleep(0.2) # 模拟网络延时 if dic

这风景如画,院子里花洒

与世无争的帅哥 提交于 2019-12-02 00:08:53
互斥锁: 进程之间的数据是不共享的,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端是没有问题的,而共享带来的竞争,竞争带来的结果就是错乱,因此我们上个锁. 锁可以让多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,牺牲了速度保证了数据的安全 进程间通信: 我们知道进程之间数据是相互隔离的,要想实现进程间的通信,就必须借助于一些技术才可以,比如木楼梯processing 模块中的,对列和管道,这两种方法v都是可以实现进程间数据传输的 ,由于队列是管道假锁 方式实现,所以我们看重研究队列即可. 创建共享的进程队列,queue是多进程安全的队列,可以使用queue实现多进程之间的数据传递. 生产者与消费者: 在并发编程中使用生产者模式能够解决大部分并发问题.该模式下通过平衡生产线和消费线程的工作能力来提高程序的整体处理数据的速度 什么是生产者消费者模式 就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通信,而通过阻塞队列来进行通信 爲什麽使用生產者和消費者模式 在綫程世界裏,生產者就是生產數據的綫程,消費者就是消費數據的綫程,在多綫程開發中,如果生產者處理速度很快,爾消費者處理速度很慢,生產者就得等消費者,爲了解決這樣的問題,引入了生產者和消費者模式 綫程: 什麽是綫程 在傳統操作系統中,每個進程有一個地址空間

Java 高并发 回顾线程--多线程基础详细介绍

安稳与你 提交于 2019-12-02 00:08:12
什么是线程: 线程是进程内的执行单元 某个进程当中都有若干个线程。 线程是进程内的执行单元。 使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。 在Java当中线程的概念和操作系统级别线程的概念是类似的。事实上,Jvm将会把Java中的线程映射到操作系统的线程区。 当new出一个线程时,其实线程并没有工作。它只是生成了一个实体,当你调用这个实例的start方法时,线程才真正地被启动。启动后到Runnable状态,Runnable表示该线程的资源等等已经被准备好,已经可以执行了,但是并不表示一定在执行状态,由于时间片轮转,该线程也可能此时并没有在执行。对于我们来说,该线程可以认为已经被执行了,但是是否真实执行,还得看物理cpu的调度。当线程任务执行结束后,线程就到了Terminated状态。 有时候在线程的执行当中,不可避免的会申请某些锁或某个对象的监视器,当无法获取时,这个线程会被阻塞住,会被挂起,到了Blocked状态。如果这个线程调用了wait方法,它就处于一个Waiting状态。进入Waiting状态的线程会等待其他线程给它notify,通知到之后由Waiting状态又切换到Runnable状态继续执行。当然等待状态有两种,一种是无限期等待

博客整理day29

余生颓废 提交于 2019-12-02 00:02:13
目录 python day29 进程互斥锁 进程间通信 队列 生产者消费者模型 线程 什么是线程 为什么要是用线程 开启线程的方式 线程对象的属性 线程互斥锁 python day29 进程互斥锁 ​ 枷锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,虽然牺牲了执行效率,保证了数据安全 ​ 在程序并发执行时,需要修改数据时使用 ''' 模拟抢票软件需求: 并发查票与抢票 1.查看余票 2.开始抢票 进程互斥锁: 让并发变成串行, 牺牲了执行效率, 保证了数据安全. 在程序并发执行时,需要修改数据时使用. ''' import json from multiprocessing import Process from multiprocessing import Lock def search(user): with open('data.txt','r',encoding='utf8') as f: dic = json.load(f) print(f'{user}查询余票,还剩余{dic["ticket_num"]}') def buy(user): with open('data.txt','r',encoding='utf8') as f: dic = json.load(f) if dic['ticket_num'] > 0: dic[

day 29

限于喜欢 提交于 2019-12-01 23:29:13
目录 网络编程(中) 网络编程(中) 进程间的通信(multiprocess.queue) 主要运用:队列; 生产消费 相当于内存中产生一个队列空间,可以存放多个数据,但数据的顺序是由先进去的排在前面的。 生产者与消费者 生产者:生产数据的 消费者:使用数据的 例子:通过队列,生产者把数据添加到队列中,消费则从队列中获取数据 线程基础 ==什么是线程== 线程与进程都是虚拟单位,目的是为了更好的描述某种事物. ​ 进程:资源单位 ​ 线程:执行单位 开启一个进程,一定会有一个线程,线程才是真正执行者. ==为什么使用线程== 节省内存资源 开启进程: 开辟一个名称空间,每开启一个进程都会占用一份内存资源. 会自带一个线程 开启线程: 一个进程可以开启多个线程 线程的开销远小于进程 注意:线程不能实现并行,线程只能实现并发,进程可以实现并行. 举例:内存就像一个工厂,子进程就像一个工厂车间,线程就像车间内的流水线. GIL全局解释器锁 在多线程环境中,python虚拟机按以下方式执行: 设置GIL; 切换到一个线程去运行; 运行指定数量的字节码指令或者线程主动让出控制(可以调用time.sleep(0)); 把线程设置为睡眠状态 解锁GIL; 再重复以上所有步骤. 锁 让并发变成串行,牺牲了执行效率,保证了数据安全. 在程序并发执行时,需要修改数据时使用. 来源: https:/

队列、进程互斥锁、线程

徘徊边缘 提交于 2019-12-01 23:27:25
目录 1.进程的并行和并发 2.并行和并发的区别 3.进程互斥锁 4.队列 4.1multiprocess.Queue介绍 4.2 IPC进程间通信实例1 4.3 ICP通信实例2:生产者与消费者模型 5.线程 5.1什么是线程? 5.2 使用线程的实际场景 5.3 内存中的线程 5.4用户级线程和内核级线程(了解) 5.5 用户级与内核级线程的对比 5.6 混合实现 5.7 GIL全局解释器锁 5.8 开启线程的两种方式 5.9 线程对象的属性 5.10 线程互斥锁 1.进程的并行和并发 并行: 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU ) 并发: 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。 2.并行和并发的区别 并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。 并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。 3.进程互斥锁 作用:让加锁的部分由并发变成串行,牺牲了执行效率,保证了数据安全。 应用:在程序使用同一份数据时,就会引发数据安全和数据混乱等问题,需要使用锁来维持数据的顺序取用。 下面的小程序模拟抢票软件

python3多线程

别来无恙 提交于 2019-12-01 22:43:59
多线程类似于同时执行多个不同程序,多线程运行有如下优点: (推荐学习: web前端视频教程 ) 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 程序的运行速度可能加快。 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 线程可以分为: 内核线程:由操作系统内核创建和撤销。 用户线程:不需要内核支持而在用户程序中实现的线程。 Python3 线程中常用的两个模块为: _thread threading(推荐使用) thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在

python面试题整理(二)

旧时模样 提交于 2019-12-01 22:42:42
1、进程,线程,协程定义,有什么区别    进程是操作系统分配资源的最小单位,一个进程对应一块CPU   线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至少要有一个线程   协程是更加轻量级的存在,不是由CPU进程管理而是由程序员管理,在执行一个函数过程中可以中断执行另一个函数,执行一个函数过程就叫协程,python3以前使用 yield 表示协程,yield关键字一般用于做生成器,实现在函数中暂停的效果,python3.3以后出现 yield from 后面跟可迭代对象,3.5以后使用 async和await 实现原生协程。     区别:     (1) 线程之间切换是由操作系统决定的 ,切换速度特别快,但是切换频率太高, 协程之间切换由程序决定 ,不会像线程切换那么耗费资源,在高并发下执行效率更高,   性能更优     (2)协程中控制共享资源不加锁     (3)协程使用同步的方式实现异步,在单进程里实现任务切换 2、子进程是什么    在一个进程中创建开启另一个进程,这个进程称为子进程,即在父进程中创建的进行 3、僵尸进程知道吗    父进程还在执行,子进程执行完毕后不会立即退出,操作系统会清理内存空间,但是保留进程号(pid),等待父进程清理资源,这个时候子进程成为僵尸进程 4、线程和协程有什么区别     

线程

社会主义新天地 提交于 2019-12-01 22:27:07
线程被称作轻量级的进程。 GIL:全局解释锁(只有Cpython解释器才有) 线程会被强迫放弃CPU的因素 (线程会受时间片影响)(GIL会限制每个线程的执行时间,一般是5毫秒)(或者限制线程执行固定数量的字节码) 对于线程来说,因为有了GIL,所以没有真正的并行 计算机的执行单位以线程为单位。计算机的最小可执行是线程。 进程是资源分配的基本单位。线程是可执行的基本单位,是可被调度的基本单位。 线程不可以自己独立拥有资源。线程的执行,必须依赖于所属进程中的资源。 进程中必须至少应该有一个线程。 线程又分为用户级线程和内核级线程(了解) 用户级线程:对于程序员来说的,这样的线程完全被程序员控制执行,调度 内核级线程:对于计算机内核来说的,这样的线程完全被内核控制调度。 进程由 代码段 数据段 PCB组成(process control block) 线程由 代码段 数据段 TCB组成(thread control block) #模块:threading #导入方法:from threading import Thread #线程和进程的比较 thread - 线程 import thread 操作线程的模块 import threading 用这个去操作线程 (1) cpu切换进程要比cpu切换线程 慢很多 在python中,如果IO操作过多的话,使用多线程最好了 (2)

python 多线程

陌路散爱 提交于 2019-12-01 19:01:14
import threading import time def run(n): print("task",n) time.sleep(2) t1=threading.Thread(target=run,args=("t1",))#一个参数也要用逗号 t2=threading.Thread(target=run,args=("t2",)) t1.start() t2.start() #最简单的多线程 来源: https://www.cnblogs.com/xupanfeng/p/11713402.html