多進程_進程理解

思路漸進目錄

  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章