python多线程

python3 多线程

坚强是说给别人听的谎言 提交于 2020-01-13 03:00:11
进程——资源分配的最小单位,线程——程序执行的最小单位 什么是进程?     程序的执行实例称为进程。每个进程都提供执行程序所需的资源。一个进程有一个虚拟地址空间,可执行代码,打开系统对象的句柄,安全上下文,一个独特的过程,pid标识符,环境变量,优先级类,最小和最大工作集大小, 并且至少有一个执行线程。 每个进程都是从一个线程开始的, 通常被称为主主线程,但是可以创建额外的 任何线程的线程。 进程与线程的区别?    线程共享内存空间,进程的内存是独立的, 同一个进程的线程之间可以直接交流,两个进程想通信,必须通过一个中间代理来实现, 创建新线程很简单, 创建新进程需要对其父进程进行一次克隆, 一个线程可以控制和操作同一进程里的其他线程,但是进程只能操作子进程 线程基本函数, run() 里面是需要执行的命令, start() 线程启动函数, join() 等待该线程结束, setDaemon(True) 设置为守护线程,设置守护线程需要放在线程启动前 Lock() 线程锁,防止数据的不准确行,线程执行时添加互斥锁 RLock() 递归锁,多个线程时需要添加递归锁,否则会出现锁死 BoundedSemaphore() 信息量,允许同时执行的最大线程数 threading.current_thread() ,当前线程; threading.active_count()

Python多线程2 join()

别说谁变了你拦得住时间么 提交于 2020-01-11 19:38:27
学习来源 原文地址 一句话:对于 线程i.join() 这一行代码,其后的代码都要等待 线程i 完成之后才能执行。 import threading import time def T1_job ( ) : print ( 'T1 start\n' ) time . sleep ( 1 ) print ( 'T1 finished' ) def T2_job ( ) : print ( 'T2 start\n' ) time . sleep ( 1 ) print ( 'T2 finished\n' ) def main ( ) : thread1 = threading . Thread ( target = T1_job , name = 'T1' ) thread2 = threading . Thread ( target = T2_job , name = 'T2' ) thread1 . start ( ) thread2 . start ( ) # print('<<<<<<<<<<<<<<<<<test point1>>>>>>>>>>>>>>>>>>>>') # thread2.join() # join()的顺序不会影响程序的实际执行 # print('<<<<<<<<<<<<<<<<<test point2>>>>>>>>>>>>>>>>>>>>')

GIL锁 验证Cpython的并发效率 GIL与互斥锁的关系 进程池,线程池

夙愿已清 提交于 2020-01-11 16:09:39
一丶GIL锁 什么是GIL锁: 存在Cpython解释器,全名:全局解释器锁.(解释器级别的锁) GIL是一把互斥锁,将并发运行变成串行. 在同一个进程下开启的多个线程,同时只能有一个线程执行,无法利用多核优势 GIL锁的作用: 保证同一时间内,共享数据只能被一个任务修改.保证数据的完整性和安全性 自动上锁和解锁,不需要人为的添加.减轻开发人员的负担 所谓诟病: 单进程的多线程不能利用多核 通常有人会认为GIL锁不能利用多核处理任务,是Python语言的诟病.个人认为任何一门语言都不是完美的,python问世于20世纪末,当时的CPU也只是单核. So,不能利用多核的原因是:同一个进程下,只允许一个线程对共享内容进行修改.不允许多线程同时处理共享数据. (打个比方:现在你家有10升(共享数据:10)牛掰的牛奶,你免费送给大家每人1升. 现在有100个人(100个线程)知道了这件事,都上你家来取奶.肯定谁先来,先得. 现在来了10个人(10个线程),每个人都说我去了1升,还剩9升.你真的还剩9升吗? 毛线~~ ,你球都不剩了. 后面来的90个人还能拿到奶吗? 肯定拿拿不到了. So你是不是得上锁,比如你家大门就是一把锁.每次只允许进来(上锁)1个人去奶.取完之后把总的奶量 减一. 第一个取完了出了大门(解锁).剩余的99个人开始抢着进你家门,公平竞争,谁先到你家门

同步,异步 阻塞,非阻塞, 异步+回调机制 线程队列 事件Event 丶协程

大兔子大兔子 提交于 2020-01-11 16:08:59
day36 一丶同步,异步 同步: 所谓同步就是一个任务需要依赖另一个任务时,只有被依赖任务执行完毕之后,依赖的任务才会完成.这是可靠的任务序列.要么都成功,要么失败,两个任务的状态可以保持一致. 异步: 所谓异步不需要等待被依赖的任务完成,只是通知依赖的任务要完成什么工作.依赖的任务也立即执行,只要自己完成了整个任务就算完成了. 至于被依赖的任务是否完成,依赖它的任务无法确定,是不可靠的任务序列 ### 同步和异步## 比如我去银行办理业务,可能会有两种方式:# 第一种 :选择排队等候;# 第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;​# 第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;​# 第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。 二丶阻塞,非阻塞, 阻塞和非阻塞两个概念与程序(也就是执行程序的'线程')等待消息通知时的状态相关 阻塞: 在程序中,阻塞代表程序'卡'在某处,必须等待这处执行完毕才能继续执行. 通常的阻塞大多数是IO阻塞 比如:银行排队取钱是一条流水线

线程,进程和协程

六月ゝ 毕业季﹏ 提交于 2020-01-11 15:30:06
python线程 Threading用于特工线程相关的操作,线程是应用程序中工作最小的单元。 1 import threading 2 import time 3 def run(arg): 4 time.sleep(1) 5 print("Hello" + str(arg)) 6 for i in range(10): 7 t = threading.Thread(target = run,args = (i,)) 8 t.start() 9 print("main thread stop") 10 11 12 13 14 15 16 17 ###执行结果,切记线程是无序的。 18 main thread stop 19 Hello0 20 Hello3 21 Hello4 22 Hello2 23 Hello1 24 Hello8 25 Hello7 26 Hello6 27 Hello5 28 Hello9 View Code 上述代码创建了10个“前台”,线程,然后控制器交给你了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: 1:start  线程准备就绪,等待CPU调度。 2:setName  为线程设置名称 3:getName  获取线程名称 4:setDaemon  设置为后台线程或前台线程(默认)   如果是后台线程,主线程执行过程中

Python之线程、进程和协程

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-11 07:58:40
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import threading 4 import time 5 6 def show(arg): 7 time.sleep(1) 8 print 'thread'+str(arg) 9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print 'main thread stop' 上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: start 线程准备就绪,等待CPU调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义 run

Python的麻烦的多线程

眉间皱痕 提交于 2020-01-10 14:50:21
对于python的多线程,也就是threading模块,从开始学到现在,依旧觉得麻烦,对,依旧这么感觉。时隔已久,来整理一下。 线程对象的方法: Start() 开始线程的执行 Run() 定义线程的功能的函数 Join(timeout=None) 程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒 getName() 返回线程的名字 setName() 设置线程的名字 isAlive() 布尔标志,表示这个线程是否还在运行 isDaemon() 返回线程的daemon标志 setDaemon(daemonic) 把线程的daemon标志设为daemonic(一定要在start()函数前调用) t.setDaemon(True) 把父线程设置为守护线程,当父进程结束时,子进程也结束。 threading类的方法: threading.enumerate() 正在运行的线程数量 两种创建多线程的方式 使用Thread()函数创建线程。 import threading import time # 多线程A def fun(i): print(str(i) + "\t" + time.strftime('%X')) for i in range(10): t = threading.Thread(target=fun, args=(i,)) t.start()

Python与多线程

≡放荡痞女 提交于 2020-01-10 12:42:36
感谢这位博主帮我打开了多线程的门 https://blog.csdn.net/m0_38011218/article/details/81938261 首先我之前学的java多线程,在java.lang包中有thread类。我们只要集成这个类然后start()。很简单有四种方式 详细见 https://www.cnblogs.com/shoshana-kong/p/9071602.html python具有异曲同工之妙 函数方式;就是简单调用库中的方法 import threading import time def sing(num): for i in range(num): print("sing%d" % i) time.sleep(1) def dance(num): for i in range(num): print("dancd%d" % i) time.sleep(1.5) if __name__ == '__main__': t_sing = threading.Thread(target=sing, args=(5, )) t_dance = threading.Thread(target=dance, args=(5, )) t_sing.start() t_dance.start() time.sleep()是为了让运行的顺序明显一点 第二种继承方式:

8.1Go并发

时光毁灭记忆、已成空白 提交于 2020-01-10 08:44:01
第八章 Go并发 Go语言区别于其他语言的一大特点就是出色的并发性能,最重要的一个特性那就是 go 关键字。 并发场景: UI小姐姐一边开着PS软件,一边微信疯狂的和产品经理打字交流,后台还听着网易云音乐。。 双11当天。。大伙疯狂的访问淘宝网站 CPU从单核向多核发展,计算机程序不该是串行的,浪费资源 串行程序由于IO操作被阻塞,整个程序处于停滞状态,其他IO无关的任务无法执行 并发必要性: 充分利用CPU核心的优势,提高程序执行效率 实现并发的模型: 多进程,多进程是在操作系统层面并发的基本模式,进程间互不影响,但是开销最大,进程由内核管理。 多线程,属于系统层面的并发模式,也是用的最多的有效模式,大多数软件使用多线程,开销小于多进程。 基于回调的非阻塞/异步IO。此架构处于多线程模式的危机,高并发服务器下,多线程会消耗殆尽服务器的内存和CPU资源。而通过事件驱动的方式使用异步IO,尽可能少用线程,降低开销,Node.js就是如此实践,但是此模式编程复杂度较高。 协程,Coroutine是一种用户态线程,寄存于线程中,系统开销极小,可以有效提高线程任务并发性,使用方式简单,结构清晰,避免多线程的缺点。需要编程语言的支持,如不支持,需要用户自行实现调度器。 共享内存系统 是比较常用的并发模式,线程之间通信采用共享内存的方式,程序员需要加锁等操作避免死锁、资源竞争等问题。

网络编程进阶:并发编程之协程、IO模型

三世轮回 提交于 2020-01-10 06:56:57
协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发; 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是该任务发生了阻塞,另一种是该任务计算的时间过长或有一个优先级更高的程序替代了它 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 如果多个任务都是纯计算的,上图的情况2并不能提升效率,因为只是让CPU来回切,这样看起来所有任务都被“同时”执行的效果,此时这种切换反而会降低效率; yield本身就是一种在单线程下可以保存任务运行状态的方法,其特点如下:   1. yield可以保存状态,yield的状态保存于操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级   2. send可以把一个函数的结果传递给另外一个函数,以此实现单线程内程序之间的切换;yield并不能实现遇到io切换 在任务1遇到io情况下,切到另外一个任务去执行,这样就可以利用任务1阻塞的时间完成其他任务的计算,效率的提升就在此处 对于单线程下,我们不可避免程序中出现io操作,如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另一个任务去计算