python3 多线程编程
0.什么是线程
1. 多线程模块
2. 创建线程的方法
3. join()方法
4.isAlive()方法
5. name属性和daemon属性
6.线程的同步---锁
7.线程的同步---Event对象
8.线程的同步---Condition条件变量
1. 多线程模块
python3对多线程支持的是 threading 模块,应用这个模块可以创建多线程程序,并且在多线程间进行同步和通信。在python3 中,可以通过两种方法来创建线程:
第一:通过 threading.Thread 直接在线程中运行函数;第二:通过继承 threading.Thread 类来创建线程
view plain copy
- import threading
- def threadfun(x,y): #线程任务函数 threadfun()
- for i in range(x,y):
- print(i)
- ta = threading.Thread(target=threadfun,args=(1,6)) #创建一个线程ta,执行 threadfun()
- tb = threading.Thread(target=threadfun,args=(10,15)) #创建一个线程tb,执行threadfun()
- ta.start() #调用start(),运行线程
- tb.start() #调用start(),运行线程
- '''''打印:1 2 3 4 5 10 11 12 13 14'''
2.通过继承 thread.Thread 类 来创建线程
这种方法只需要重载 threading.Thread 类的 run 方法,然后调用 start()开启线程就可以了
- import threading
- class mythread(threading.Thread):
- def run(self):
- for i in range(1,5):
- print(i)
- ma = mythread();
- mb = mythread();
- ma.start()
- mb.start()
view plain copy
- import threading
- import time
- class mythread(threading.Thread):
- def run(self):
- self.i = 1
- print('%d'%(self.i))
- self.i = self.i+1
- time.sleep(1) #睡眠一秒
- print('%d'%(self.i))
- time.sleep(1)
- if __name__ == '__main__':
- ta = mythread() #实例化线程
- ta.start() #开启ta线程
- ta.join() #主线程等待 ta线程结束才继续执行
- print('main thread over')
view plain copy
- import threading
- import time
- class mythread(threading.Thread):
- def run(self):
- time.sleep(2)
- if __name__ == '__main__':
- ta = mythread() #实例化线程
- print(ta.isAlive()) #打印False,因为未执行 start()来使ta线程运行
- ta.start()
- print(ta.isAlive()) #打印Ture,因为ta线程运行了
- time.sleep(3)
- print(ta.isAlive()) #打印False,因为ta线程已经结束了
5. name属性和daemon属性
1.name属性表示线程的线程名 默认是 Thread-x x是序号,由1开始,第一个创建的线程名字就是 Thread-1
- import threading
- import time
- class mythread(threading.Thread):
- def run(self):
- pass
- if __name__ == '__main__':
- ta = mythread() #实例化线程
- ta.name = 'thread-ta'
- tb = mythread()
- tb.start()
- ta.start()
- print(ta.name) #打印 thread-ta
- print(tb.name) #打印 Thread-2
view plain copy
- import threading
- import time
- class mythread(threading.Thread):
- def run(self):
- time.sleep(2)
- print('my thread over')
- def main():
- ta = mythread()
- ta.daemon = True
- ta.start()
- print('main thread over')
- if __name__ == '__main__':
- main()
- #打印结果 :main thread over 然后马上结束程序
6.线程的同步---锁
当一个进程拥有多个线程之后,如果他们各做各的任务互没有关系还行,但既然属于同一个进程,他们之间总是具有一定关系的。比如多个线程都要对某个数据进行修改,则可能会出现不可预料的结果。为保证操作正确,就需要引入锁来进行线程间的同步。
python3 中的 threading 模块提供了
RLock锁(可重入锁)。对于某一时间只能让一个线程操作的语句放到 RLock的acquire 方法 和 release方法之间。即
acquire()方法相当于给RLock 锁 上锁,而 release() 相当于解锁。
- import threading
- import time
- class mythread(threading.Thread):
- def run(self):
- global x #声明一个全局变量
- lock.acquire() #上锁,acquire()和release()之间的语句一次只能有一个线程进入,其余线程在acquire()处等待
- x += 10
- print('%s:%d'%(self.name,x))
- lock.release() #解锁
- x = 0
- lock = threading.RLock() #创建 可重入锁
- def main():
- l = []
- for i in range(5):
- l.append(mythread()) #创建 5 个线程,并把他们放到一个列表中
- for i in l:
- i.start() #开启列表中的所有线程
- if __name__ =='__main__':
- main()
打印结果:
Thread-1:10
Thread-2:20
Thread-3:30
Thread-4:40
Thread-5:50
7.线程的同步---Event对象
Event对象存在于 threading 模块中。Event 实例管理着 一个内部标志,通过 set() 方法来将该标志设置成 True,使用
clear() 方法将该标志重置成 False
wait() 方法会使当前线程阻塞直到标志被设置成 True,wait()可以选择给他一个参数,代表时间,代表阻塞多长时间,若不设置就是阻塞直到标志被设置为True
isSet()方法 :能判断标志位是否被设置为True
- import threading
- import time
- class Mon(threading.Thread):
- def run(self):
- Dinner.clear()
- print('Cooking dinner')
- time.sleep(3)
- Dinner.set() #标志设置为True
- print(self.name,':dinner is OK!')
- class Son(threading.Thread):
- def run(self):
- while True:
- if Dinner.isSet(): #判断标志位是否被设置为True
- break
- else:
- print('dinner isnot ready!')
- Dinner.wait(1)
- print(self.name,':Eating Dinner')
- def main():
- mon = Mon()
- son = Son()
- mon.name = 'Mon'
- son.name = 'Son'
- mon.start()
- son.start()
- if __name__ == '__main__':
- Dinner = threading.Event()
- main()
- '''''
- Cooking dinner
- dinner isnot ready!
- dinner isnot ready!
- dinner isnot ready!
- Mon :dinner is OK!
- Son :Eating Dinner
- '''
注意,这里的wait()跟上面Event提到的wait()不是同一样东西
notify()
发出资源可用的信号,唤醒任意一条因 wait()阻塞的进程
notifyAll()
发出资源可用信号,唤醒所有因wait()阻塞的进程
下面给出一个例子,一家蛋糕店:只会做一个蛋糕,卖出后才会再做一个。绝对不会做积累到2个蛋糕。
- import threading
- import time
- class Server(threading.Thread):
- def run(self):
- global x
- while True:
- con.acquire()
- while x>0:
- con.wait()
- x += 1
- time.sleep(1)
- print(self.name,':I make %d cake!'%(x))
- con.notifyAll()
- con.release()
- class Client(threading.Thread):
- def run(self):
- global x
- con.acquire()
- while x == 0:
- con.wait()
- x-=1
- print(self.name,'I bought a cake! the rest is %d cake'%(x))
- con.notifyAll()
- con.release()
- def main():
- ser = Server()
- ser.name = 'Cake Server'
- client = []
- for i in range(3):
- client.append(Client())
- ser.start()
- for c in client:
- c.start()
- if __name__ =='__main__':
- x = 0
- con = threading.Condition()
- main()
- '''''
- 打印结果:
- Cake Server :I make 1 cake!
- Thread-3 I bought a cake! the rest is 0 cake
- Cake Server :I make 1 cake!
- Thread-4 I bought a cake! the rest is 0 cake
- Cake Server :I make 1 cake!
- Thread-2 I bought a cake! the rest is 0 cake
- Cake Server :I make 1 cake!
- '''
python3 多线程编程的更多相关文章
- Python3 多线程编程 - 学习笔记
线程 什么是线程 特点 线程与进程的关系 Python3中的多线程 全局解释器锁(GIL) GIL是啥? GIL对Python程序有啥影响? 改善GIL产生的问题 Python3关于多线程的模块 多线 ...
- Python3 多线程编程(thread、threading模块)
threading是对thread的封装. 1.开启线程: t=threading.Thread(target=sayhi,args=('hh',)) t.start() 或者先建一个Thread的继 ...
- Python3 多线程编程 threading模块
性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...
- python --- 基础多线程编程
在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- Python3 多进程编程 - 学习笔记
Python3 多进程编程(Multiprocess programming) 为什么使用多进程 具体用法 Python多线程的通信 进程对列Queue 生产者消费者问题 JoinableQueue ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- Web Worker javascript多线程编程(二)
Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...
随机推荐
- nyoj 1129 Salvation
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1129 题目分析:感觉题目说的不是多么的清晰,看了别人的分析觉得,也就是说在一个方向不能拐 ...
- Unity3d中模型导入轴向不对的解决方法
在unity3d中导入模型,经常会遇到模型的轴向与unity中默认的轴向不符合的情况. 网上有很多解决办法都是说在3dmax中导出模型时修改模型的轴向,那么我接下来讲的就是如何在unity里面修改模型 ...
- 一种安全云存储方案设计(下)——基于Lucene的云端搜索与密文基础上的模糊查询
一种安全的云存储方案设计(未完整理中) 一篇老文了,现在看看错漏颇多,提到的一些技术已经跟不上了.仅对部分内容重新做了一些修正,增加了一些机器学习的内容,然并卵. 这几年来,云产品层出不穷,但其安全性 ...
- Eclipse 查找
Eclipse 查找 工作空间中查找 Eclipse 查找对话框中可以允许用户在指定工作空间上使用单词或字母模式来查找文件. 或者你可以在指定项目或在 package explorer 视图上选择好指 ...
- HDU 2571 命运 (简单DP)
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- < 转载 > 说说JSON和JSONP
推荐博文---说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 里头说的很详细!
- java微信开发API解析(四)-自己定义菜单以及个性化菜单实现
全局说明 * 具体说明请參考前两篇文章. 本文说明 *本文分为五部分: * 工具类AccessTokenUtils的封装 * 自己定义菜单和个性化菜单文档的阅读解析 * 菜单JSON的分析以及构建相应 ...
- HttpWatch使用教程
一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功 ...
- Unity3d 多次显示关闭一个UI
publicclass OpenClooseGoUI : MonoBehaviour { public GameObject closeBt; public GameObject goUI ...
- IOS时间与日期处理
本文转载至 http://blog.sina.com.cn/s/blog_9cd1705d0102v5x4.html 主要有以下类: NSDate -- 表示一个绝对的时间点NSTimeZone ...