线程的语法 (event,重要)
Python threading模塊
2種調(diào)用方式
直接調(diào)用
| 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):?#定義每個(gè)線程要運(yùn)行的函數(shù) ????print("running on number:%s"?%num) ????time.sleep(3) if?__name__?==?'__main__': ????t1?=?threading.Thread(target=sayhi,args=(1,))?#生成一個(gè)線程實(shí)例 ????t2?=?threading.Thread(target=sayhi,args=(2,))?#生成另一個(gè)線程實(shí)例 ????t1.start()?#啟動(dòng)線程 ????t2.start()?#啟動(dòng)另一個(gè)線程 ????print(t1.getName())?#獲取線程名 ????print(t2.getName()) |
繼承式調(diào)用
| 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):#定義每個(gè)線程要運(yùn)行的函數(shù) ????????print("running on number:%s"?%self.num) ????????time.sleep(3) if?__name__?==?'__main__': ????t1?=?MyThread(1) ????t2?=?MyThread(2) ????t1.start() ????t2.start() |
?第二種有點(diǎn)傻
基本語法
is_alive() 當(dāng)前活躍的線程
例子:
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')執(zhí)行結(jié)果:
bmw wait red light True 33例子對(duì)比:
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')執(zhí)行結(jié)果:
False 444?
Join ()
等待!其實(shí)就wait()。
等待該線程執(zhí)行完畢
Daemon()
守護(hù)進(jìn)程!有句話怎么說來著!守護(hù)進(jìn)程被吞噬!
# _*_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線程設(shè)置為Daemon線程,它做為程序主線程的守護(hù)線程,當(dāng)主線程退出時(shí),m線程也會(huì)退出,由m啟動(dòng)的其它子線程會(huì)同時(shí)退出,不管是否執(zhí)行完任務(wù) t1.start() t2.start() # 看下就懂了,不懂試一試就想起來了 t1.join() t2.join()print("---end time----",time.time()-start_time)?
線程鎖(互斥鎖Mutex)
lock()
為什么上鎖?因?yàn)楹枚嗑€程同時(shí)修改一個(gè)數(shù)據(jù),有先后順序,有的沒干完,就被gil了,所以對(duì)修改數(shù)據(jù)的地方加把鎖,保證該數(shù)據(jù)的正確性!
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?#在每個(gè)線程中都獲取這個(gè)全局變量 ????print('--get num:',num ) ????time.sleep(1) ????num??-=1?#對(duì)此公共變量進(jìn)行-1操作 num?=?100??#設(shè)定一個(gè)共享變量 thread_list?=?[] for?i?in?range(100): ????t?=?threading.Thread(target=addNum) ????t.start() ????thread_list.append(t) for?t?in?thread_list:?#等待所有線程執(zhí)行完畢 ????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?#在每個(gè)線程中都獲取這個(gè)全局變量 ????print('--get num:',num ) ????time.sleep(1) ????lock.acquire()?#修改數(shù)據(jù)前加鎖 ????num??-=1?#對(duì)此公共變量進(jìn)行-1操作 ????lock.release()?#修改后釋放 num?=?100??#設(shè)定一個(gè)共享變量 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:?#等待所有線程執(zhí)行完畢 ????t.join() print('final num:', num ) |
RLock(遞歸鎖)
這個(gè)主要針對(duì)函數(shù)甲里邊包涵函數(shù)乙,函數(shù)乙又有函數(shù)丙
繞進(jìn)去了,很麻煩,用lock的話容易死循環(huán),所以用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(信號(hào)量)
互斥鎖 同時(shí)只允許一個(gè)線程更改數(shù)據(jù),而Semaphore是同時(shí)允許一定數(shù)量的線程更改數(shù)據(jù) ,比如廁所有3個(gè)坑,那最多只允許3個(gè)人上廁所,后面的人只能等里面有人出來了才能再進(jìn)去。
例子:
| 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個(gè)線程同時(shí)運(yùn)行 ????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 ?
重點(diǎn),標(biāo)識(shí)符,event可以理解成對(duì)全局變量不停的修改,!!!!!!這個(gè)我感覺后邊能用的到,用event來驗(yàn)證result
語法有
event = threading.Event()
創(chuàng)建標(biāo)識(shí)符
?
event.set( )
設(shè)置標(biāo)識(shí)符
?
event.wait( )
等待標(biāo)識(shí)符出現(xiàn),一旦出現(xiàn)立刻執(zhí)行后邊的代碼
print(‘殺啊!!’) event.wait() print( ‘撤退!!,殺個(gè)瘠薄’?
event.clear( )
清空標(biāo)志位
通過Event來實(shí)現(xiàn)兩個(gè)或多個(gè)線程間的交互
紅綠燈例子!!
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()運(yùn)行結(jié)果
?
轉(zhuǎn)載于:https://www.cnblogs.com/PYlog/p/9240692.html
總結(jié)
以上是生活随笔為你收集整理的线程的语法 (event,重要)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10照片背景黑色改为白色
- 下一篇: php 匹配图片路径_php正则匹配图片