threading模块函数
1.threading.active_count():返回当前存活的threading.Thread线程对象数量,等同于len(threading.enumerate())。
import threading print(threading.active_count()) print(len(threading.enumerate()))
输出:
1 1
2.threading.get_ident():返回当前线程的线程标识符。注意当一个线程退出时,它的线程标识符可能会被之后新创建的线程复用。
import threading print(threading.current_thread()) print(threading.get_ident())
输出:
<_MainThread(MainThread, started 26816)> 26816
3.threading.enumerate():返回当前存活的threading.Thread线程对象列表。
import threading print(threading.enumerate())
输出:
[<_MainThread(MainThread, started 25328)>]
4.threading.Event()
事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞;如果“Flag”值为True,那么执行event.wait 方法时便不再阻塞。
clear:将“Flag”设置为False
set:将“Flag”设置为True
用 threading.Event 实现线程间通信,使用threading.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中,
Event默认内置了一个标志,初始值为False。一旦该线程通过wait()方法进入等待状态,直到另一个线程调用该Event的set()方法将内置标志设置为True时,该Event会通知所有等待状态的线程恢复运行。
通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。
import threading,time,random def light(): if not event.is_set(): event.set() n = 0 while True: if n < 10: print('此时是绿灯,可以通行!') elif n < 13: print('此时是黄灯,请减速!') elif n < 20: print('此时是红灯,禁止通行!!!') event.clear() # 此时的flage为Flase else: n = 0 event.set() # 打开绿灯,此时的Flage为True time.sleep(1) n += 1 def car(c): time.sleep(random.randrange(3, 10)) while True: if event.is_set(): print('%s 正在通过' % c) else: print('%s 正在的等红灯' % c) event.wait() if __name__ == '__main__': event = threading.Event() c = ['BMW', 'AUDI', 'Benz'] light = threading.Thread(target=light) light.start() for i in c: t = threading.Thread(target=car, args=(i,)) t.start()
5. thread.join(timeout=None)
会阻塞调用这个方法的线程,直到被调用 join() 的线程终结 -- 不管是正常终结还是抛出未处理异常 -- 或者直到发生超时,超时选项是可选的。
当 timeout 参数存在而且不是 None 时,它应该是一个用于指定操作超时的以秒为单位的浮点数或者分数。
因为 join() 总是返回 None ,所以你一定要在 join() 后调用 is_alive() 才能判断是否发生超时 -- 如果线程仍然存活,则 join() 超时。
当 timeout 参数不存在或者是 None ,这个操作会阻塞直到线程终结。
(1)未设置timeout
import threading, time def test(): n = 0 while n < 10: print(n) n += 1 time.sleep(1) c = threading.Thread(target=test) c.start() c.join() print(c.is_alive()) print('结束')
输出:
0 1 2 ... 8 9 False 结束
(2)设置timeout
import threading, time def test(): n = 0 while n < 10: print(n) n += 1 time.sleep(1) c = threading.Thread(target=test) c.start() c.join(timeout=5) print(c.is_alive()) print('结束')
输出:
0 1 2 3 4 True 结束 5 6 7 8 9
6.thread.setDaemon()
设置守护线程,主线程结束后,子线程不管是否结束强制结束;
import threading,time def ccc(): n = 0 while n < 10: print(n) n += 1 time.sleep(1) c = threading.Thread(target=ccc) print(c.daemon) # 查看状态 c.setDaemon(True) # 设置守护线程 print(c.daemon) c.start() print('jieshu')
输出:
False
True
0jieshu
7.threading.Lock()
线程锁,如果多个线程共同对某个数据修改,则可能出现不可预料的结果,因为操作系统调用多线程的顺序是随机的,为了保证数据的正确性,需要加锁。
import threading # 假如这是你的银行村矿 balance = 0 lock = threading.Lock() def change_it(n): global balance balance = balance + n balance = balance - n def run_thread(n): for i in range(100000): lock.acquire() #获取锁 change_it(n) lock.release() #释放锁 t1 = threading.Thread(target=run_thread, args=(5,)) t2 = threading.Thread(target=run_thread, args=(8,)) t1.start() t2.start() t1.join() t2.join() print(balance)
8.threading.Condition()
可以把Condiftion理解为一把高级的琐,它提供了比Lock, RLock更高级的功能,允许我们能够控制复杂的线程同步问题。
(1)wait([timeout]):线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s)才会被唤醒继续运行。
(2)notify(n=1):通知其他线程,那些挂起的线程接到这个通知之后会开始运行,默认是通知一个正等待该condition的线程,最多则唤醒n个等待的线程。notify()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。notify()不会主动释放Lock。
(3)notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程(这个一般用得少)
import threading,time def Seeker(cond, name): time.sleep(2) cond.acquire() print('%s :我已经蒙上眼睛了!' % name) cond.notify() cond.wait() for i in range(3): print('%s is finding!!!' % name) time.sleep(2) cond.notify() cond.release() print('%s :我赢了!' % name) def Hider(cond, name): cond.acquire() cond.wait() for i in range(3): print('%s is Hiding!!!' % name) time.sleep(2) print('%s :我已经藏好了,你快来找我吧!!!' % name) cond.notify() cond.wait() cond.release() print('%s :被你找到了,唉~^~!' % name) if __name__ == '__main__': cond = threading.Condition() seeker = threading.Thread(target=Seeker,args=(cond,'seeker')) hider = threading.Thread(target=Hider,args=(cond,'Hider')) seeker.start() hider.start()
原文地址:https://www.cnblogs.com/landlord1127/p/15099050.html
- Android 仿京东、拼多多商品分类页
- 简单高效的实现 Android App 全局字体替换
- 基于 RxJava2+Retrofit2 精心打造的 Android 基础框架 XSnow
- Android 图片选择到裁剪之步步深坑
- Android自定义 View 实战之 StickerView
- 十分钟搞定酷炫动画,Android自定义 View 入门
- 基础篇章:关于 React Native 之 Switch 和 ProgressBarAndroid 组件的讲解
- Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)
- 基础篇章:关于 React Native 之 ToolbarAndroid 组件的讲解
- Android M 权限最佳实践
- Android自定义ViewGroup神器-ViewDragHelper
- Android 中常见的内存泄漏
- Android 高级自定义Toast及源码解析
- 环境配置:React Native 开发环境配置 For Android
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 简直骚操作,ThreadLocal还能当缓存用
- 品优购(IDEA版)-第一天
- 品优购(IDEA版)-第二天
- 品优购第四天
- 深度学习框架OneFlow的并行特色(附框架源码和教程)
- 图解Java设计模式
- python 如何解决 No module named ‘pip‘问题
- 用多智能体强化学习算法MADDPG解决"老鹰捉小鸡"问题
- 网站日志实时分析之Flink处理实时热门和PVUV统计
- 大数据量下的集合过滤—Bloom Filter
- 实时数仓链路分享:kafka =>SparkStreaming=>kudu集成kerberos
- rocketmq broker启动报错,找不到或无法加载主类
- 视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?
- 2020CHINC,来赴一场“共建智慧医院”的约会
- 《闲扯Redis十》Redis 跳跃表的结构实现