国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:4日期: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视频免费观看 | 美女视频永久黄网站在线观看 | 亚洲视频三区 | 91精品成人免费国产片 | 国产91精品一区二区视色 | 国产精品久久久影院 | 性盈盈影院影院67194 | 欧美一级特黄特黄做受 | 久久中文亚洲国产 | 欧美大尺度xxxxx视频 | 欧美在线视频看看 | 欧美日韩一区二区视频图片 | 国产高清在线精品一区二区 | 国产成人啪精品视频免费网 | 欧美h版成版在线观看 | 久久黄色影院 | 男人的天堂中文字幕 | 欧美69视频在线 | 国产一区二区三区欧美精品 | 精品国产96亚洲一区二区三区 | 免费特黄一级欧美大片在线看 | 久久久久久久久久久大尺度免费视频 | 国产欧美在线观看 | 美欧毛片 | 99视频在线精品免费观看18 | 欧美在线一区二区三区 | 真正全免费视频a毛片 | 国产一级视频播放 | 国产精品亚洲精品爽爽 | 黄色三级网站 | 特级淫片欧美高清视频蜜桃 | 国内外成人免费视频 | 欧美精品久久 | 国产一区二| 亚洲国产成人精品久久 | 亚洲精品精品一区 | 一级白嫩美女毛片免费 |