av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

Python多線程編程之threading模塊詳解

瀏覽:2日期:2022-06-21 11:51:31
一、介紹

線程是什么?線程有啥用?線程和進程的區別是什么?

線程是操作系統能夠進行運算調度的最小單位。被包含在進程中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。

二、Python如何創建線程2.1 方法一:

創建Thread對象

步驟:

1.目標函數

2.實例化Thread對象

3.調用start()方法

import threading# 目標函數1def fun1(num): for i in range(num):print(’線程1: 第%d次循環:’ % i)# 目標函數2def fun2(lst): for ele in lst:print(’線程2: lst列表中元素 %d’ % ele)def main(): num = 10 # 實例化Thread對象 # target參數一定為一個函數,且不帶括號 # args參數為元組類型,參數為一個時一定要加逗號 t1 = threading.Thread(target=fun1, args=(num,)) t2 = threading.Thread(target=fun2, args=([1, 2, 3, 4, 5],)) # 調用start方法 t1.start() t2.start()if __name__ == ’__main__’: main()2.2 方法二:

創建子類繼承threading.Thread類

import threadingimport osclass Person(threading.Thread): def run(self):self.sing(5)self.cook() @staticmethod def sing(num):for i in range(num): print(’線程[%d]: The person sing %d song.’ % (os.getpid(), i)) @staticmethod def cook():print(’線程[%d]:The person has cooked breakfast.’ % os.getpid())def main(): p1 = Person() p1.start() p2 = Person() p2.start()if __name__ == ’__main__’: main()三、線程的用法3.1 確定當前的線程

import threadingimport timeimport loggingdef fun1(): print(threading.current_thread().getName(), ’starting’) time.sleep(0.2) print(threading.current_thread().getName(), ’exiting’)def fun2(): # print(threading.current_thread().getName(), ’starting’) # time.sleep(0.3) # print(threading.current_thread().getName(), ’exiting’) logging.debug(’starting’) time.sleep(0.3) logging.debug(’exiting’)logging.basicConfig( level=logging.DEBUG, format=’[%(levelname)s] (%(threadName)-10s) %(message)s’)def main(): t1 = threading.Thread(name=’線程1’, target=fun1) t2 = threading.Thread(name=’線程2’, target=fun2) t1.start() t2.start()if __name__ == ’__main__’: main()3.2 守護線程

區別

普通線程:主線程等待子線程關閉后關閉 守護線程:管你子線程關沒關,主線程到時間就關閉

守護線程如何搞

方法1:構造線程時傳入dameon=True 方法2:調用setDaemon()方法并提供參數True

import threadingimport timeimport loggingdef daemon(): logging.debug(’starting’) # 添加延時,此時主線程已經退出,exiting不會打印 time.sleep(0.2) logging.debug(’exiting’)def non_daemon(): logging.debug(’starting’) logging.debug(’exiting’)logging.basicConfig( level=logging.DEBUG, format=’[%(levelname)s] (%(threadName)-10s) %(message)s’)def main(): # t1 = threading.Thread(name=’線程1’, target=daemon) # t1.setDaemon(True) t1 = threading.Thread(name=’線程1’, target=daemon, daemon=True) t2 = threading.Thread(name=’線程2’, target=non_daemon) t1.start() t2.start() # 等待守護線程完成工作需要調用join()方法,默認情況join會無限阻塞,可以傳入浮點值,表示超時時間 t1.join(0.2) t2.join(0.1)if __name__ == ’__main__’: main()3.3 控制資源訪問

目的:

Python線程中資源共享,如果不對資源加上互斥鎖,有可能導致數據不準確。

import threadingimport timeg_num = 0def fun1(num): global g_num for i in range(num):g_num += 1 print(’線程1 g_num = %d’ % g_num)def fun2(num): global g_num for i in range(num):g_num += 1 print(’線程2 g_num = %d’ % g_num)def main(): t1 = threading.Thread(target=fun1, args=(1000000,)) t2 = threading.Thread(target=fun1, args=(1000000,)) t1.start() t2.start()if __name__ == ’__main__’: main() time.sleep(1) print(’主線程 g_num = %d’ % g_num)

互斥鎖

import threadingimport timeg_num = 0L = threading.Lock()def fun1(num): global g_num L.acquire() for i in range(num):g_num += 1 L.release() print(’線程1 g_num = %d’ % g_num)def fun2(num): global g_num L.acquire() for i in range(num):g_num += 1 L.release() print(’線程2 g_num = %d’ % g_num)def main(): t1 = threading.Thread(target=fun1, args=(1000000,)) t2 = threading.Thread(target=fun1, args=(1000000,)) t1.start() t2.start()if __name__ == ’__main__’: main() time.sleep(1) print(’主線程 g_num = %d’ % g_num)

互斥鎖引發的另一個問題:死鎖

死鎖產生的原理:

Python多線程編程之threading模塊詳解

import threadingimport timeg_num = 0L1 = threading.Lock()L2 = threading.Lock()def fun1(): L1.acquire(timeout=5) time.sleep(1) L2.acquire() print(’產生死鎖,并不會打印信息’) L2.release() L1.release()def fun2(): L2.acquire(timeout=5) time.sleep(1) L1.acquire() print(’產生死鎖,并不會打印信息’) L1.release() L2.release()def main(): t1 = threading.Thread(target=fun1) t2 = threading.Thread(target=fun2) t1.start() t2.start()if __name__ == ’__main__’: main() time.sleep(1) print(’主線程 g_num = %d’ % g_num)

如何避免產生死鎖:

鎖超時操作

import threadingimport timeg_num = 0L1 = threading.Lock()L2 = threading.Lock()def fun1(): L1.acquire() time.sleep(1) L2.acquire(timeout=5) print(’超時異常打印信息1’) L2.release() L1.release()def fun2(): L2.acquire() time.sleep(1) L1.acquire(timeout=5) print(’超時異常打印信息2’) L1.release() L2.release()def main(): t1 = threading.Thread(target=fun1) t2 = threading.Thread(target=fun2) t1.start() t2.start()if __name__ == ’__main__’: main() time.sleep(1) print(’主線程 g_num = %d’ % g_num)

到此這篇關于Python多線程編程之threading模塊詳解的文章就介紹到這了,更多相關python threading模塊內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 黄色在线小视频 | 国产精品一二三区 | 亚洲精品91 | 97精品在线 | 日韩欧美国产成人 | 四虎8848精品成人免费网站 | 亚洲国产一区在线 | 香蕉视频在线观看网站 | 日韩亚洲在线 | 黄色成年人视频 | 国产一区精品在线观看 | 亚洲精品自拍视频 | 黄色小说视频网站 | 日本www视频 | 国产一二| 亚洲三级小说 | 岛国av噜噜噜久久久狠狠av | 天天操综合网 | 日韩av专区 | 久久久亚洲精品视频 | 国产精品一区一区三区 | 欧美黄色网 | 日韩不卡在线观看 | 丝袜美腿一区二区三区 | 亚洲精品一二三区 | 91玖玖| 青青草国产在线视频 | 日韩一级在线 | 麻豆av在线 | 久久一区二区三区四区 | 午夜看片 | 三级黄色在线观看 | 亚洲影视一区 | 久久久久久久成人 | 亚洲综合激情网 | 亚洲黄色片 | 亚洲免费精品视频 | 91av免费在线观看 | 午夜视频在线 | 午夜精品影院 | 久久久久久久影院 |