手把手帶你了解python多進(jìn)程,多線(xiàn)程
說(shuō)明
相應(yīng)的學(xué)習(xí)視頻見(jiàn)鏈接,本文只對(duì)重點(diǎn)進(jìn)行總結(jié)。


多進(jìn)程
重點(diǎn)(只要看下面代碼的main函數(shù)即可)
1.創(chuàng)建
2.如何開(kāi)守護(hù)進(jìn)程
3.多進(jìn)程,開(kāi)銷(xiāo)大,用for循環(huán)調(diào)用多個(gè)進(jìn)程時(shí),后臺(tái)cpu一下就上去了
import time
import multiprocessing
import os
def dance(who,num):
print("dance父進(jìn)程:{}".format(os.getppid()))
for i in range(1,num+1):
print("進(jìn)行編號(hào):{}————{}跳舞。。。{}".format(os.getpid(),who,i))
time.sleep(0.5)
def sing(num):
print("sing父進(jìn)程:{}".format(os.getppid()))
for i in range(1,num+1):
print("進(jìn)行編號(hào):{}----唱歌。。。{}".format(os.getpid(),i))
time.sleep(0.5)
def work():
for i in range(10):
print("工作中。。。")
time.sleep(0.2)
if __name__ == '__main__':
# print("main主進(jìn)程{}".format(os.getpid()))
start= time.time()
#1 進(jìn)程的創(chuàng)建與啟動(dòng)
# # 1.1創(chuàng)建進(jìn)程對(duì)象,注意dance不能加括號(hào)
# # dance_process = multiprocessing.Process(target=dance)#1.無(wú)參數(shù)
# dance_process=multiprocessing.Process(target=dance,args=("lin",3))#2.以args=元祖方式
# sing_process = multiprocessing.Process(target=sing,kwargs={"num":3})#3.以kwargs={}字典方式
# # 1.2啟動(dòng)進(jìn)程
# dance_process.start()
# sing_process.start()
#2.默認(rèn)-主進(jìn)程和子進(jìn)程是分開(kāi)的,主進(jìn)程只要1s就可以完成,子進(jìn)程要2s,主進(jìn)程會(huì)等所有子進(jìn)程執(zhí)行完,再退出
# 2.1子守護(hù)主進(jìn)程,當(dāng)主一但完成,子就斷開(kāi)(如qq一關(guān)閉,所有聊天窗口就沒(méi)了).daemon=True
work_process = multiprocessing.Process(target=work,daemon=True)
work_process.start()
time.sleep(1)
print("主進(jìn)程完成了!")#主進(jìn)程和子進(jìn)程是分開(kāi)的,主進(jìn)程只要1s就可以完成,子進(jìn)程要2s,主進(jìn)程會(huì)等所有子進(jìn)程執(zhí)行完,再退出
print("main主進(jìn)程花費(fèi)時(shí)長(zhǎng):",time.time()-start)
#
多線(xiàn)程

重點(diǎn)
1.創(chuàng)建
2.守護(hù)線(xiàn)程
3.線(xiàn)程安全問(wèn)題(多人搶票,會(huì)搶到同一張)
import time
import os
import threading
def dance(num):
for i in range(num):
print("進(jìn)程編號(hào):{},線(xiàn)程編號(hào):{}————跳舞。。。".format(os.getpid(),threading.current_thread()))
time.sleep(1)
def sing(count):
for i in range(count):
print("進(jìn)程編號(hào):{},線(xiàn)程編號(hào):{}----唱歌。。。".format(os.getpid(),threading.current_thread()))
time.sleep(1)
def task():
time.sleep(1)
thread=threading.current_thread()
print(thread)
if __name__ == '__main__':
# start=time.time()
# # sing_thread =threading.Thread(target=dance,args=(3,),daemon=True)#設(shè)置成守護(hù)主線(xiàn)程
# sing_thread = threading.Thread(target=dance, args=(3,))
# dance_thread = threading.Thread(target=sing,kwargs={"count":3})
#
# sing_thread.start()
# dance_thread.start()
#
# time.sleep(1)
# print("進(jìn)程編號(hào):{}主線(xiàn)程結(jié)束...用時(shí){}".format(os.getpid(),(time.time()-start)))
for i in range(10):#多線(xiàn)程之間執(zhí)行是無(wú)序的,由cpu調(diào)度
sub_thread = threading.Thread(target=task)
sub_thread.start()
線(xiàn)程安全
由于線(xiàn)程直接是無(wú)序進(jìn)行的,且他們共享同一個(gè)進(jìn)程的全部資源,所以會(huì)產(chǎn)生線(xiàn)程安全問(wèn)題(比如多人在線(xiàn)搶票,買(mǎi)到同一張)


#下面代碼在沒(méi)有l(wèi)ock鎖時(shí),會(huì)賣(mài)出0票,加上lock就正常
import threading
import time
lock =threading.Lock()
class Sum_tickets:
def __init__(self,tickets):
self.tickets=tickets
def window(sum_tickets):
while True:
with lock:
if sum_tickets.tickets>0:
time.sleep(0.2)
print(threading.current_thread().name,"取票{}".format(sum_tickets.tickets))
sum_tickets.tickets-=1
else:
break
if __name__ == '__main__':
sum_tickets=Sum_tickets(10)
sub_thread1 = threading.Thread(name="窗口1",target=window,args=(sum_tickets,))
sub_thread2 = threading.Thread(name="窗口2",target=window,args=(sum_tickets,))
sub_thread1.start()
sub_thread2.start()
高并發(fā)拷貝(多進(jìn)程,多線(xiàn)程)
import os
import multiprocessing
import threading
import time
def copy_file(file_name,source_dir,dest_dir):
source_path = source_dir+"/"+file_name
dest_path =dest_dir+"/"+file_name
print("當(dāng)前進(jìn)程為:{}".format(os.getpid()))
with open(source_path,"rb") as source_file:
with open(dest_path,"wb") as dest_file:
while True:
data=source_file.read(1024)
if data:
dest_file.write(data)
else:
break
pass
if __name__ == '__main__':
source_dir=r'C:\Users\Administrator\Desktop\注意力'
dest_dir=r'C:\Users\Administrator\Desktop\test'
start = time.time()
try:
os.mkdir(dest_dir)
except:
print("目標(biāo)文件已存在")
file_list =os.listdir(source_dir)
count=0
#1多進(jìn)程
for file_name in file_list:
count+=1
print(count)
sub_processor=multiprocessing.Process(target=copy_file,
args=(file_name,source_dir,dest_dir))
sub_processor.start()
# time.sleep(20)
print(time.time()-start)
#這里有主進(jìn)程和子進(jìn)程,通過(guò)打印可以看出,主進(jìn)程在創(chuàng)建1,2,3,4,,,21過(guò)程中,子進(jìn)程已有的開(kāi)始執(zhí)行,也就是說(shuō),每個(gè)進(jìn)程是互不影響的
# 9
# 10
# 11
# 12
# 13
# 當(dāng)前進(jìn)程為:2936(當(dāng)主進(jìn)程創(chuàng)建第13個(gè)時(shí),此時(shí),第一個(gè)子進(jìn)程開(kāi)始工作)
# 14
# 當(dāng)前進(jìn)程為:10120
# 當(dāng)前進(jìn)程為:10440
# 15
# 當(dāng)前進(jìn)程為:9508
# 2多線(xiàn)程
# for file_name in file_list:
# count += 1
# print(count)
# sub_thread = threading.Thread(target=copy_file,
# args=(file_name, source_dir, dest_dir))
# sub_thread.start()
# # time.sleep(20)
# print(time.time() - start)
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用PyTorch實(shí)現(xiàn)去噪擴(kuò)散模型的完整代碼
在本文中,我們將深入研究DDPM的復(fù)雜性,涵蓋其訓(xùn)練過(guò)程,包括正向和逆向過(guò)程,并探索如何執(zhí)行采樣,在整個(gè)探索過(guò)程中,我們將使用PyTorch從頭開(kāi)始構(gòu)建DDPM,并完成其完整的訓(xùn)練,需要的朋友可以參考下2024-01-01
簡(jiǎn)單總結(jié)Python中序列與字典的相同和不同之處
這篇文章主要介紹了Python中序列與字典的相同和不同之處,序列這里講到Python中最常用的列表和元組以及字典三種,需要的朋友可以參考下2016-01-01
Python全面分析系統(tǒng)的時(shí)域特性和頻率域特性
今天小編就為大家分享一篇Python全面分析系統(tǒng)的時(shí)域特性和頻率域特性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python實(shí)現(xiàn)多項(xiàng)式擬合正弦函數(shù)詳情
這篇文章主要介紹了Python實(shí)現(xiàn)多項(xiàng)式擬合正弦函數(shù)詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
django開(kāi)發(fā)post接口簡(jiǎn)單案例,獲取參數(shù)值的方法
今天小編就為大家分享一篇django開(kāi)發(fā)post接口簡(jiǎn)單案例,獲取參數(shù)值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

