說明
相應的學習視頻見鏈接,本文只對重點進行總結。


多進程
重點(只要看下面代碼的main函數即可)
1.創建
2.如何開守護進程
3.多進程,開銷大,用for循環調用多個進程時,后臺cpu一下就上去了
import time
import multiprocessing
import os
def dance(who,num):
print("dance父進程:{}".format(os.getppid()))
for i in range(1,num+1):
print("進行編號:{}————{}跳舞。。。{}".format(os.getpid(),who,i))
time.sleep(0.5)
def sing(num):
print("sing父進程:{}".format(os.getppid()))
for i in range(1,num+1):
print("進行編號:{}----唱歌。。。{}".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主進程{}".format(os.getpid()))
start= time.time()
#1 進程的創建與啟動
# # 1.1創建進程對象,注意dance不能加括號
# # dance_process = multiprocessing.Process(target=dance)#1.無參數
# dance_process=multiprocessing.Process(target=dance,args=("lin",3))#2.以args=元祖方式
# sing_process = multiprocessing.Process(target=sing,kwargs={"num":3})#3.以kwargs={}字典方式
# # 1.2啟動進程
# dance_process.start()
# sing_process.start()
#2.默認-主進程和子進程是分開的,主進程只要1s就可以完成,子進程要2s,主進程會等所有子進程執行完,再退出
# 2.1子守護主進程,當主一但完成,子就斷開(如qq一關閉,所有聊天窗口就沒了).daemon=True
work_process = multiprocessing.Process(target=work,daemon=True)
work_process.start()
time.sleep(1)
print("主進程完成了!")#主進程和子進程是分開的,主進程只要1s就可以完成,子進程要2s,主進程會等所有子進程執行完,再退出
print("main主進程花費時長:",time.time()-start)
#
多線程

重點
1.創建
2.守護線程
3.線程安全問題(多人搶票,會搶到同一張)
import time
import os
import threading
def dance(num):
for i in range(num):
print("進程編號:{},線程編號:{}————跳舞。。。".format(os.getpid(),threading.current_thread()))
time.sleep(1)
def sing(count):
for i in range(count):
print("進程編號:{},線程編號:{}----唱歌。。。".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)#設置成守護主線程
# 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("進程編號:{}主線程結束...用時{}".format(os.getpid(),(time.time()-start)))
for i in range(10):#多線程之間執行是無序的,由cpu調度
sub_thread = threading.Thread(target=task)
sub_thread.start()
線程安全
由于線程直接是無序進行的,且他們共享同一個進程的全部資源,所以會產生線程安全問題(比如多人在線搶票,買到同一張)


#下面代碼在沒有lock鎖時,會賣出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()
高并發拷貝(多進程,多線程)
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("當前進程為:{}".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("目標文件已存在")
file_list =os.listdir(source_dir)
count=0
#1多進程
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)
#這里有主進程和子進程,通過打印可以看出,主進程在創建1,2,3,4,,,21過程中,子進程已有的開始執行,也就是說,每個進程是互不影響的
# 9
# 10
# 11
# 12
# 13
# 當前進程為:2936(當主進程創建第13個時,此時,第一個子進程開始工作)
# 14
# 當前進程為:10120
# 當前進程為:10440
# 15
# 當前進程為:9508
# 2多線程
# 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)
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
您可能感興趣的文章:- 分析詳解python多線程與多進程區別
- Python多進程共享numpy 數組的方法
- 總結python多進程multiprocessing的相關知識
- Python多線程與多進程相關知識總結
- python實現多進程并發控制Semaphore與互斥鎖LOCK
- python 多進程和多線程使用詳解
- python 實現多進程日志輪轉ConcurrentLogHandler
- Python多進程與多線程的使用場景詳解
- python多進程執行方法apply_async使用說明
- Python 多進程原理及實現
- python多線程和多進程關系詳解
- Python多進程的使用詳情