日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程的语法 (event,重要)

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程的语法 (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,重要)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。