深入理解python多線程編程
進程
進程的概念:
進程是資源分配的最小單位,他是操作系統(tǒng)進行資源分配和調(diào)度運行的基本單位。通俗理解:一個正在運行的一個程序就是一個進程。例如:正在運行的qq、wechat等,它們都是一個進程。
進程的創(chuàng)建步驟
1.導入進程包
import multiprocessing
2.通過進程類創(chuàng)建進程對象
進程對象 = multiprocessing.Process()
3.啟動進程執(zhí)行任務
進程對象.start()
import multiprocessing import time def sing(): for i in range(3): print("唱歌。。。") time.sleep(0.5) def dance(): for i in range(3): print("跳舞。。。") time.sleep(0.5) if __name__ == '__main__': time1 = time.time() s1 = multiprocessing.Process(target=sing) d1 = multiprocessing.Process(target=dance) s1.start() d1.start() s1.join() #這個方法可以等待子進程結束后再繼續(xù)往下運行,通常用于進程間的同步 d1.join() print(time.time()-time1)
帶有參數(shù)的進程
args元組,kwargs字典
import multiprocessing import time def sing(name, num): for i in range(num): print("%s在唱歌。。。"%name) time.sleep(0.5) def dance(num): for i in range(num): print("跳舞。。。") time.sleep(0.5) if __name__ == '__main__': # 以元組形式傳參 s1 = multiprocessing.Process(target=sing, args=('小明', 3)) # 以字典形式傳參 d1 = multiprocessing.Process(target=dance, kwargs={"num": 5, }) s1.start() d1.start()
進程的注意點
主進程會等待所有的子進程執(zhí)行結束在結束
設置守護主進程
主進程結束后不會再繼續(xù)執(zhí)行子進程中剩余的工作 work_process = multiprocessing.Process(target=work, daemon=True)
線程
線程的介紹
實現(xiàn)多任務的另一種形式
線程是程序執(zhí)行的最小單位
同屬一個進程的多個線程共享進程所擁有的全部資源
線程的創(chuàng)建步驟
導入線程包
import threading
通過線程類創(chuàng)建進程對象
線程對象 = threading.Thread()
啟動線程執(zhí)行任務
線程對象.start()
優(yōu)缺點對比
1.進程優(yōu)缺點:
優(yōu)點:可以用多核,可以并行
缺點:資源開銷大
2.線程優(yōu)缺點:
優(yōu)點:資源開銷小
缺點:不可用多核,依附于進程一個進程一個核
案例-多進程實現(xiàn)視頻文件夾多任務拷貝器
需求分析:
目標文件夾是否存在,如果不存在就創(chuàng)建,存在則不創(chuàng)建
遍歷源文件夾中所有文件,并拷貝到目標文件夾
采用進程實現(xiàn)多任務,并完成拷貝
實現(xiàn)步驟
定義源文件夾所在的路徑,目標文件夾所在路徑
創(chuàng)建目標文件夾
通過os.listdir獲取源目錄中的文件列表
遍歷每個文件,定義一個函數(shù),專門實現(xiàn)文件拷貝
采用進程實現(xiàn)多任務,完成高并發(fā)拷貝
import os import multiprocessing def copy_file(file_name, source_dir, dest_dir): # 1 拼接源文件路徑和目標文件路徑 source_path = source_dir + '\\' + file_name dest_path = dest_dir + '\\' + file_name # 2 打開源文件和目標文件 with open(source_path, 'rb') as source_file: with open(dest_path, 'wb') as dest_file: # 3 循環(huán)讀取源文件到目標路徑 while True: data = source_file.read(1024) if data: dest_file.write(data) else: break if __name__ == '__main__': # 1 定義源文件夾和目標文件夾 source_dir = r'E:\TCT\TIFF_tran\pos_1' dest_dir= r'F:\目標文件夾' # 2.創(chuàng)建目標文件夾 try: os.mkdir(dest_dir) except: print("目標文件夾已經(jīng)存在") # 3.讀取源文件夾的文件列表 file_list = os.listdir(source_dir) # 4.遍歷文件列表實現(xiàn)拷貝 for file_name in file_list: # copy_file(file_name, source_dir, dest_dir) # 5.使用多進程實現(xiàn)多任務拷貝 sub_process = multiprocessing.Process(target=copy_file, args=(file_name, source_dir, dest_dir)) sub_process.start()
#線程 import os import threading def copy_file(file_name, source_dir, dest_dir): # 1 拼接源文件路徑和目標文件路徑 source_path = source_dir + '\\' + file_name dest_path = dest_dir + '\\' + file_name # 2 打開源文件和目標文件 with open(source_path, 'rb') as source_file: with open(dest_path, 'wb') as dest_file: # 3 循環(huán)讀取源文件到目標路徑 while True: data = source_file.read(1024) if data: dest_file.write(data) else: break if __name__ == '__main__': # 1 定義源文件夾和目標文件夾 source_dir = r'F:\迅雷下載\視頻-智能機器人從0到1系統(tǒng)入門課程\視頻' dest_dir= r'F:\目標文件夾' # 2.創(chuàng)建目標文件夾 try: os.mkdir(dest_dir) except: print("目標文件夾已經(jīng)存在") # 3.讀取源文件夾的文件列表 file_list = os.listdir(source_dir) # 4.遍歷文件列表實現(xiàn)拷貝 for file_name in file_list: # copy_file(file_name, source_dir, dest_dir) # 5.使用多線程實現(xiàn)多任務拷貝 sub_thread = threading.Thread(target=copy_file, args=(file_name, source_dir, dest_dir)) sub_thread.start() for file_name in file_list: sub_thread.join() sub_thread.join()#主線程等待所有線程結束才會結束
到此這篇關于python多線程編程的文章就介紹到這了,更多相關python多線程編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
YOLOv5車牌識別實戰(zhàn)教程(三)模型訓練與評估
這篇文章主要介紹了YOLOv5車牌識別實戰(zhàn)教程(三)模型訓練與評估,在這個教程中,我們將一步步教你如何使用YOLOv5進行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下2023-04-04Python圖像銳化與邊緣檢測之Sobel與Laplacian算子詳解
圖像銳化和邊緣檢測主要包括一階微分銳化和二階微分銳化,本文主要講解常見的圖像銳化和邊緣檢測方法,即Sobel算子和Laplacian算子,感興趣的可以了解一下2022-12-12