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

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

線程是什么?線程有啥用?線程和進程的區(qū)別是什么?

線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。被包含在進程中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。

二、Python如何創(chuàng)建線程2.1 方法一:

創(chuàng)建Thread對象

步驟:

1.目標(biāo)函數(shù)

2.實例化Thread對象

3.調(diào)用start()方法

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

創(chuàng)建子類繼承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 確定當(dāng)前的線程

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 守護線程

區(qū)別

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

守護線程如何搞

方法1:構(gòu)造線程時傳入dameon=True 方法2:調(diào)用setDaemon()方法并提供參數(shù)True

import threadingimport timeimport loggingdef daemon(): logging.debug(’starting’) # 添加延時,此時主線程已經(jīng)退出,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() # 等待守護線程完成工作需要調(diào)用join()方法,默認情況join會無限阻塞,可以傳入浮點值,表示超時時間 t1.join(0.2) t2.join(0.1)if __name__ == ’__main__’: main()3.3 控制資源訪問

目的:

Python線程中資源共享,如果不對資源加上互斥鎖,有可能導(dǎo)致數(shù)據(jù)不準(zhǔn)確。

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)

互斥鎖引發(fā)的另一個問題:死鎖

死鎖產(chǎn)生的原理:

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

import threadingimport timeg_num = 0L1 = threading.Lock()L2 = threading.Lock()def fun1(): L1.acquire(timeout=5) time.sleep(1) L2.acquire() print(’產(chǎn)生死鎖,并不會打印信息’) L2.release() L1.release()def fun2(): L2.acquire(timeout=5) time.sleep(1) L1.acquire() print(’產(chǎn)生死鎖,并不會打印信息’) 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)

如何避免產(chǎn)生死鎖:

鎖超時操作

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)

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: aaaaaaa片毛片免费观看 | 欧美日韩在线观看视频网站 | 国产午夜精品久久久 | 欧美一区二区在线播放 | 成人av免费 | 一级看片免费视频 | 精品欧美一区免费观看α√ | 插插宗合网 | 亚洲一区在线播放 | 亚洲精品一区二三区不卡 | 久久婷婷色 | 日韩综合网 | 国产伦一区二区三区四区 | 欧美在线视频a | 一区二区三区成人 | 青青草精品视频 | 天堂va在线 | 在线免费观看黄a | 中文字幕在线观看一区二区 | 亚洲精久 | 一本大道久久a久久精二百 欧洲一区二区三区 | 亚洲成人精品 | 中文字幕 国产 | 欧美一区二区在线观看 | 国产精品久久久久久久久久久免费看 | 亚洲第一成年免费网站 | 日本精品一区二区三区在线观看视频 | 国产在线视频在线观看 | 久久久国产一区二区三区 | 欧美电影网 | 欧美电影一区 | 久久久久久久久一区 | 精品亚洲一区二区三区四区五区 | 婷婷综合网 | 国产成人av一区二区三区 | 久久天天 | 国产精品久久久久久久久久妇女 | 超碰欧美 | 一区二区三区在线免费看 | av天天干| 日本韩国欧美在线观看 |