线程的语法 (event,重要)
Python threading模块
2种调用方式
直接调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import threading
import time
def sayhi(num): #定义每个线程要运行的函数
print ( "running on number:%s" % num)
time.sleep( 3 )
if __name__ = = '__main__' :
t1 = threading.Thread(target = sayhi,args = ( 1 ,)) #生成一个线程实例
t2 = threading.Thread(target = sayhi,args = ( 2 ,)) #生成另一个线程实例
t1.start() #启动线程
t2.start() #启动另一个线程
print (t1.getName()) #获取线程名
print (t2.getName())
|
继承式调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import threading
import time
class MyThread(threading.Thread):
def __init__( self ,num):
threading.Thread.__init__( self )
self .num = num
def 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()
|
第二种有点傻
基本语法
is_alive() 当前活跃的线程
例子:
car1 = threading.Thread(target=car,args=('bmw',)) car1.start() print(car1.is_alive()) if car1.is_alive():print('33') if not car1.is_alive():print('444')
执行结果:
bmw wait red light True 33
例子对比:
car1 = threading.Thread(target=car,args=('bmw',)) # car1.start() 注释掉 print(car1.is_alive()) if car1.is_alive():print('33') if not car1.is_alive():print('444')
执行结果:
False 444
Join ()
等待!其实就wait()。
等待该线程执行完毕
Daemon()
守护进程!有句话怎么说来着!守护进程被吞噬!
# _*_coding:utf-8_*_ import time import threadingstart_time=time.time() def run(n):print('[%s]------running----\n' % n)time.sleep(2)print('--done--%s'%n)def run2(n):print('[%s]------running----\n' % n)time.sleep(5)print('--done--%s'%n) lis_1=[] t1 = threading.Thread(target=run, args=('run%1',)) t2 = threading.Thread(target=run2, args=('run%2',))lis_1.append(t1) lis_1.append(t2) # t2.setDaemon(True)# 将main线程设置为Daemon线程,它做为程序主线程的守护线程,当主线程退出时,m线程也会退出,由m启动的其它子线程会同时退出,不管是否执行完任务 t1.start() t2.start() # 看下就懂了,不懂试一试就想起来了 t1.join() t2.join()print("---end time----",time.time()-start_time)
线程锁(互斥锁Mutex)
lock()
为什么上锁?因为好多线程同时修改一个数据,有先后顺序,有的没干完,就被gil了,所以对修改数据的地方加把锁,保证该数据的正确性!
lock
=
threading.Lock()
#生成全局锁
不带锁例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import time
import threading
def addNum():
global num #在每个线程中都获取这个全局变量
print ( '--get num:' ,num )
time.sleep( 1 )
num - = 1 #对此公共变量进行-1操作
num = 100 #设定一个共享变量
thread_list = []
for i in range ( 100 ):
t = threading.Thread(target = addNum)
t.start()
thread_list.append(t)
for t in thread_list: #等待所有线程执行完毕
t.join()
print ( 'final num:' , num )
|
带锁例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import time
import threading
def addNum():
global num #在每个线程中都获取这个全局变量
print ( '--get num:' ,num )
time.sleep( 1 )
lock.acquire() #修改数据前加锁
num - = 1 #对此公共变量进行-1操作
lock.release() #修改后释放
num = 100 #设定一个共享变量
thread_list = []
lock = threading.Lock() #生成全局锁
for i in range ( 100 ):
t = threading.Thread(target = addNum)
t.start()
thread_list.append(t)
for t in thread_list: #等待所有线程执行完毕
t.join()
print ( 'final num:' , num )
|
RLock(递归锁)
这个主要针对函数甲里边包涵函数乙,函数乙又有函数丙
绕进去了,很麻烦,用lock的话容易死循环,所以用Rlock,一键上锁,保证不乱。例子看看就好。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import threading,time
def run1():
print ( "grab the first part data" )
lock.acquire()
global num
num + = 1
lock.release()
return num
def run2():
print ( "grab the second part data" )
lock.acquire()
global num2
num2 + = 1
lock.release()
return num2
def run3():
lock.acquire()
res = run1()
print ( '--------between run1 and run2-----' )
res2 = run2()
lock.release()
print (res,res2)
if __name__ = = '__main__' :
num,num2 = 0 , 0
lock = threading.RLock()
for i in range ( 10 ):
t = threading.Thread(target = run3)
t.start()
while threading.active_count() ! = 1 :
print (threading.active_count())
else :
print ( '----all threads done---' )
print (num,num2)
|
Semaphore(信号量)
互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import threading,time
def run(n):
semaphore.acquire()
time.sleep( 1 )
print ( "run the thread: %s\n" % n)
semaphore.release()
if __name__ = = '__main__' :
num = 0
semaphore = threading.BoundedSemaphore( 5 ) #最多允许5个线程同时运行
for i in range ( 20 ):
t = threading.Thread(target = run,args = (i,))
t.start()
while threading.active_count() ! = 1 :
pass #print threading.active_count()
else :
print ( '----all threads done---' )
print (num)
|
Events
重点,标识符,event可以理解成对全局变量不停的修改,!!!!!!这个我感觉后边能用的到,用event来验证result
语法有
event = threading.Event()
创建标识符
event.set( )
设置标识符
event.wait( )
等待标识符出现,一旦出现立刻执行后边的代码
print(‘杀啊!!’) event.wait() print( ‘撤退!!,杀个瘠薄’
event.clear( )
清空标志位
通过Event来实现两个或多个线程间的交互
红绿灯例子!!
import time import threadingevent=threading.Event()def car(name):while True:if event.is_set():print('%s is runing'%name)time.sleep(1)else:print('%s wait red light' % name)event.wait()time.sleep(1)def light():conent = 0event.set()while True:if conent >5 and conent <10:event.clear()print('\033[41;1mred light is on ....\033[0m')elif conent >10:event.set()conent = 0else:print('\033[42;1mgreen is come!\033[0m')time.sleep(1)conent += 1light = threading.Thread(target=light,)car2 = threading.Thread(target=car,args=('tesla',))car1 = threading.Thread(target=car,args=('bmw',)) light.start() car1.start() car2.start()
运行结果
转载于:https://www.cnblogs.com/PYlog/p/9240692.html
线程的语法 (event,重要)相关推荐
- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 孤荷凌寒自学python第四十一天python的线程同步之Event对象
孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于是 ...
- Windows多线程(四) 经典线程同步 事件Event
第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManu ...
- 经典线程同步 事件Event
Event 内核对象,实际上是解决线程同步问题的利器. 介绍下函数应用: 第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_A ...
- 线程同步 -事件Event、临界区对象CriticalSection
事件Event: 基本函数: 全局对象:HANDLE g_hEvent 创建事件对象:g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL) 重置状态为无信号:Rese ...
- python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例
一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...
- python中event_Python Event实现线程通信
Event是一种非常简单的线程通信机制,一个线程发出一个 Event,另一个线程可通过该 Event 被触发. Event 本身管理一个内部旗标,程序可以通过 Event 的 set() 方法将该旗标 ...
- 以下会使线程进入到阻塞状态的是_Python并行编程(五):多线程同步之event(事件)...
什么是事件? 事件在内部管理了一个标志Flag,如果Flag值为 False,那么线程在执行event.wait方法时就会阻塞等值直到Flag值为True,该线程便会顺利执行,而Flag的值是通过ev ...
- python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
最新文章
- 宁波Uber优步司机奖励政策(1月18日~1月24日)
- python详细安装教程3.7.4-python 3.7.4下载与安装的问题
- [leetcode]203. Remove Linked List Elements链表中删除节点
- 关于如何使用反编译器,获取源码清单
- Class类中的getEnclosing*、getDeclared*与getDeclaringClass的区别
- cigarettes(香烟)
- 博科查看光功率_法拉第旋光器:非互易性旋转光的偏振
- 1. UI Tests简介
- 性能测试之JMeter取样器详解:sampler
- createEventObject 与 createEvent EDIT WATCH
- Linux内核探索之路——关于书
- java武士风度_CH2906 武士风度的牛(算竞进阶习题)
- 网站视频链接自动提取下载
- CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scen 论文阅读
- 滑动t检验在matlab上的实现
- 成功制作海报的十个简单法则
- 用认真的态度面对人生用心的思考
- 神舟战神Z8-CA5NP,RTX3060怎么样?测评值得买吗?详细性能点评
- 什么是黑盒测试和白盒测试、灰盒测试?
- linux系统四个组成部分,Linux系统由哪几部分组成?系统详解(干货)