思路漸進目錄
- 1、創建子進程
- 2、測試Process對象的相關方法
- 3、多進程執行順序是不確定的
- 4、進程之間不共享全局數據
- 5、使用Queue完成進程之間的通信
- 6、使用多進程完成文件的拷貝
實現過程代碼
1、創建子進程
import time
import multiprocessing
import os
def proc_func(number,age):
print(age)
print("這是子進程%d PID:%d 父進程的PID:%d" % (number,os.getpid(),os.getppid()))
for i in range(3):
print("這是子進程")
time.sleep(1)
if __name__ == '__main__':
# 創建一個子進程
# 創建一個進程的執行計劃 target指定子進程執行的函數代碼 args指定函數代碼所需的參數
pro = multiprocessing.Process(target=proc_func, args=(100,), kwargs={'age':18})
# PID process identify
# os.getpid() 獲取當前進程的PID
# os.getppid() parent process identify 獲取當前進程的父進程的PID
# 啓動子進程的創建和執行
pro.start()
# 用來判斷子進程是否存活 存活返回True 退出了返回False
print(pro.is_alive())
# 用來阻塞等待子進程結束 然後纔會繼續往下執行 如果有參數 則表示阻塞等待的超時時間
pro.join(1)
print("join1 ")
print(pro.is_alive())
pro.join()
print(pro.is_alive())
# while True:
# print("這是主進程 PID:%d" % os.getpid())
# time.sleep(1)
# """如果創建子進程 怎麼獲取當前進程PID 當前進程的父進程的PID(PPID)"""
2、測試Process對象的相關方法
import time
import multiprocessing
import os
def proc_func(number,age):
print(age)
print("這是子進程%d PID:%d 父進程的PID:%d" % (number,os.getpid(),os.getppid()))
for i in range(3):
print("這是子進程")
time.sleep(1)
if __name__ == '__main__':
# 創建一個子進程
# 創建一個進程的執行計劃 target指定子進程執行的函數代碼 args指定函數代碼所需的參數
pro = multiprocessing.Process(target=proc_func, args=(100,), name='SSS',kwargs={'age':18})
# PID process identify
# os.getpid() 獲取當前進程的PID
# os.getppid() parent process identify 獲取當前進程的父進程的PID
# 啓動子進程的創建和執行
# 如果子進程還沒有創建 則獲取不到PID
# print(pro.pid)
pro.start()
# 獲取進程對象標識的 進程的名稱
print(pro.name)
# os.getpid()
print(pro.pid)
print(pro.is_alive())
# terminate()作用是告訴操作系統 讓子進程退出 -----> 產生了時間差
# pro.terminate()
# time.sleep(0.1)
pro.join()
print(pro.is_alive())
3、多進程執行順序是不確定的
import multiprocessing
import time
def worker1(no):
while True:
print(no)
time.sleep(1)
def worker2(no):
while True:
print(no)
time.sleep(1)
if __name__ == '__main__':
# 多個進程執行順序不確定
for i in range(5):
pro1 = multiprocessing.Process(target=worker1,args=(i,))
pro1.start()
4、進程之間不共享全局數據
import multiprocessing
import time
g_number = 0
def worker1(no):
print(g_number)
global g_number
g_number += 99
while True:
time.sleep(1)
print("worker1 獲取到的%d" % g_number)
def worker2(no):
while True:
time.sleep(1)
print("worker2 獲取到的%d" % g_number)
if __name__ == '__main__':
# 多個進程內部不共享全局數據 ----> 每個進程是獨立的數據空間
# 在主進程創建子進程的時候 會將全局數據給子進程拷貝一份
# 在子進程中修改全局數據不影響其他進程的全局數據
pro1 = multiprocessing.Process(target=worker1,args=(0,))
pro1.start()
pro2 = multiprocessing.Process(target=worker2,args=(1,))
pro2.start()
5、使用Queue完成進程之間的通信
import multiprocessing
import time
"""主進程往隊列中放入屏幕上輸入的數據 子進程從隊列中取出數據並且打印出來"""
def proc_func(queue):
while True:
if queue.empty():
print("隊列是空的 我稍後來取一次")
time.sleep(2)
else:
data = queue.get()
print("從隊列中取出數據%s" % data)
time.sleep(2)
if __name__ == '__main__':
# 1 創建一個隊列 參數表示隊列的最大長度
queue = multiprocessing.Queue(3)
# 2 創建一個子進程
pro = multiprocessing.Process(target=proc_func, args=(queue,))
pro.start()
# 3 錄入數據 放入隊列
while True:
if queue.full():
print("隊列已滿")
time.sleep(1)
else:
data = input("請輸入:")
queue.put(data)
print("當前隊列數據條數是%s" % queue.qsize())
"""如何創建隊列 放數據 取數據"""
6、使用多進程完成文件的拷貝
import os
import multiprocessing
import time
def copy_file(src_path, file_name, dest_path, queue):
"""源目錄 文件名 目的目錄"""
# demo 01.py demo-備份
# 打開一個源文件 讀取
src_file = open(src_path + '/' + file_name, 'rb')
# 打開一個目標文件 寫入
dest_file = open(dest_path + '/' + file_name, 'wb')
file_data = src_file.read()
dest_file.write(file_data)
# 關閉文件
src_file.close()
dest_file.close()
# 通過隊列告訴主進程 我已經完成這個文件的拷貝
queue.put(file_name)
if __name__ == '__main__':
# 1 用戶輸入需要拷貝的源目錄名稱
src_path = input("請輸入你需要拷貝的目錄名:")
# 2 根據該目錄名稱 創建一個目的目錄 -備份
dest_path = src_path + '-備份'
os.mkdir(dest_path)
# 創建一個隊列 -主進程 和 多個完成文件拷貝的子進程之間 進行通信
queue = multiprocessing.Queue()
# 3 獲取到源目錄下使用的文件信息列表 爲每個文件複製任務創建一個進程完成
file_list = os.listdir(src_path)
for file in file_list:
# print(file)
pro = multiprocessing.Process(target=copy_file, args=(src_path, file, dest_path, queue))
pro.start()
# 計數 完成拷貝的文件數量
count = 0
while True:
queue.get()
count += 1
print("\r 當前進度是%% %f" % (count / len(file_list) * 100), end='')
time.sleep(0.4)
if count == len(file_list):
print("完成拷貝")
break