久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

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

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

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

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

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

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

創(chuàng)建Thread對(duì)象

步驟:

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

2.實(shí)例化Thread對(duì)象

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 # 實(shí)例化Thread對(duì)象 # target參數(shù)一定為一個(gè)函數(shù),且不帶括號(hào) # args參數(shù)為元組類型,參數(shù)為一個(gè)時(shí)一定要加逗號(hào) 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 守護(hù)線程

區(qū)別

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

守護(hù)線程如何搞

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

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

目的:

Python線程中資源共享,如果不對(duì)資源加上互斥鎖,有可能導(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ā)的另一個(gè)問題:死鎖

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

鎖超時(shí)操作

import threadingimport timeg_num = 0L1 = threading.Lock()L2 = threading.Lock()def fun1(): L1.acquire() time.sleep(1) L2.acquire(timeout=5) print(’超時(shí)異常打印信息1’) L2.release() L1.release()def fun2(): L2.acquire() time.sleep(1) L1.acquire(timeout=5) print(’超時(shí)異常打印信息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)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 大英县| 高青县| 宜城市| 镇赉县| 赣州市| 通化市| 时尚| 盘山县| 镇雄县| 政和县| 邵阳市| 日土县| 冀州市| 徐水县| 寿宁县| 瑞昌市| 即墨市| 肃宁县| 台北县| 九龙坡区| 龙胜| 南川市| 丰镇市| 尼木县| 济阳县| 三门县| 上栗县| 内江市| 邢台市| 黄冈市| 鄂托克前旗| 莒南县| 阿克| 怀集县| 手游| 淮安市| 灌阳县| 丹凤县| 沐川县| 梁山县| 阿瓦提县|