進(jìn)程
進(jìn)程的概念:
進(jìn)程是資源分配的最小單位,他是操作系統(tǒng)進(jìn)行資源分配和調(diào)度運(yùn)行的基本單位。通俗理解:一個正在運(yùn)行的一個程序就是一個進(jìn)程。例如:正在運(yùn)行的qq、wechat等,它們都是一個進(jìn)程。
進(jìn)程的創(chuàng)建步驟
1.導(dǎo)入進(jìn)程包
import multiprocessing
2.通過進(jìn)程類創(chuàng)建進(jìn)程對象
進(jìn)程對象 = multiprocessing.Process()
3.啟動進(jìn)程執(zhí)行任務(wù)
進(jìn)程對象.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() #這個方法可以等待子進(jìn)程結(jié)束后再繼續(xù)往下運(yùn)行,通常用于進(jìn)程間的同步
d1.join()
print(time.time()-time1)
帶有參數(shù)的進(jìn)程
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()
進(jìn)程的注意點
主進(jìn)程會等待所有的子進(jìn)程執(zhí)行結(jié)束在結(jié)束
設(shè)置守護(hù)主進(jìn)程
主進(jìn)程結(jié)束后不會再繼續(xù)執(zhí)行子進(jìn)程中剩余的工作
work_process = multiprocessing.Process(target=work, daemon=True)
線程
線程的介紹
實現(xiàn)多任務(wù)的另一種形式
線程是程序執(zhí)行的最小單位
同屬一個進(jìn)程的多個線程共享進(jìn)程所擁有的全部資源
線程的創(chuàng)建步驟
導(dǎo)入線程包
import threading
通過線程類創(chuàng)建進(jìn)程對象
線程對象 = threading.Thread()
啟動線程執(zhí)行任務(wù)
線程對象.start()
優(yōu)缺點對比
1.進(jìn)程優(yōu)缺點:
優(yōu)點:可以用多核,可以并行
缺點:資源開銷大
2.線程優(yōu)缺點:
優(yōu)點:資源開銷小
缺點:不可用多核,依附于進(jìn)程一個進(jìn)程一個核
案例-多進(jìn)程實現(xiàn)視頻文件夾多任務(wù)拷貝器
需求分析:
目標(biāo)文件夾是否存在,如果不存在就創(chuàng)建,存在則不創(chuàng)建
遍歷源文件夾中所有文件,并拷貝到目標(biāo)文件夾
采用進(jìn)程實現(xiàn)多任務(wù),并完成拷貝
實現(xiàn)步驟
定義源文件夾所在的路徑,目標(biāo)文件夾所在路徑
創(chuàng)建目標(biāo)文件夾
通過os.listdir獲取源目錄中的文件列表
遍歷每個文件,定義一個函數(shù),專門實現(xiàn)文件拷貝
采用進(jìn)程實現(xiàn)多任務(wù),完成高并發(fā)拷貝
import os
import multiprocessing
def copy_file(file_name, source_dir, dest_dir):
# 1 拼接源文件路徑和目標(biāo)文件路徑
source_path = source_dir + '\\' + file_name
dest_path = dest_dir + '\\' + file_name
# 2 打開源文件和目標(biāo)文件
with open(source_path, 'rb') as source_file:
with open(dest_path, 'wb') as dest_file:
# 3 循環(huán)讀取源文件到目標(biāo)路徑
while True:
data = source_file.read(1024)
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
# 1 定義源文件夾和目標(biāo)文件夾
source_dir = r'E:\TCT\TIFF_tran\pos_1'
dest_dir= r'F:\目標(biāo)文件夾'
# 2.創(chuàng)建目標(biāo)文件夾
try:
os.mkdir(dest_dir)
except:
print("目標(biāo)文件夾已經(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.使用多進(jìn)程實現(xiàn)多任務(wù)拷貝
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 拼接源文件路徑和目標(biāo)文件路徑
source_path = source_dir + '\\' + file_name
dest_path = dest_dir + '\\' + file_name
# 2 打開源文件和目標(biāo)文件
with open(source_path, 'rb') as source_file:
with open(dest_path, 'wb') as dest_file:
# 3 循環(huán)讀取源文件到目標(biāo)路徑
while True:
data = source_file.read(1024)
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
# 1 定義源文件夾和目標(biāo)文件夾
source_dir = r'F:\迅雷下載\視頻-智能機(jī)器人從0到1系統(tǒng)入門課程\視頻'
dest_dir= r'F:\目標(biāo)文件夾'
# 2.創(chuàng)建目標(biāo)文件夾
try:
os.mkdir(dest_dir)
except:
print("目標(biāo)文件夾已經(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)多任務(wù)拷貝
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()#主線程等待所有線程結(jié)束才會結(jié)束
到此這篇關(guān)于python多線程編程的文章就介紹到這了,更多相關(guān)python多線程編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 分析Python感知線程狀態(tài)的解決方案之Event與信號量
- 像線程一樣管理進(jìn)程的Python multiprocessing庫
- Python爬蟲之線程池的使用
- Python多線程編程之threading模塊詳解
- Python一些線程的玩法總結(jié)