Python進程

進程

  • 概念:指的時運行的程序以及運行時用到的資源這個整體稱之為進程

經(jīng)典三狀態(tài):

  • 就緒態(tài):運行的條件都已經(jīng)慢去,正在等待cpu執(zhí)行(cpu分配時間片執(zhí)行,切換到執(zhí)行態(tài))
  • 執(zhí)行態(tài):cpu正在執(zhí)行其功能(時間片用完就切換到就緒態(tài))
  • 等待態(tài):在運行的代碼中有需要等待某些條件(數(shù)據(jù)input()、時間sleep())阻塞等待,如果條件滿足,切換到就緒態(tài)

創(chuàng)建進程:

    pro = multiprocessing.Process(target= 函數(shù)名, args=(參數(shù)列表元組))
    pro.start()

主進程阻塞等待子進程退出

  pro.join(time)  表示主進程最多等子進程time秒
  pro.is_alilve()  判斷子進程是否存活
  pro.terminate() 直接終止子進程(信號有延時)-->.join()
  pid:當前進程的進程號(ps aux,ps -eflgrep)
  getpid()子進程的pid,getppid() 子進程的父進程的pid

進程間是獨立的地址空間,所以不共享全局變量

進程間通信Queue

創(chuàng)建隊列

q = multiprocessing.Queue(參數(shù)表示隊列最大長度)
q.put()  存放數(shù)據(jù)
q.get()  取出數(shù)據(jù)
q.full()  判斷是否滿了
q.empty() 判斷是否空了
q.qsize() 獲取隊列長度

進程池Pool

創(chuàng)建進程池

    p = multiprocessing.Pool(參數(shù)表示進程的最大數(shù)量)
    # 添加任務
    p.apply  是阻塞添加任務,會等待添加的任務執(zhí)行完成才會繼續(xù)往下執(zhí)行
    p.apply_async  非阻塞的任務添加,只管添加任務,不等任務結束
    # 關閉進程池
    p.close()
    p.terminate()  強制終止進程池中所有的正在執(zhí)行的進程任務
    # 等待所有任務執(zhí)行完成
    p.join()  保持主進程存活,等待所有子進程完成

注意事項

  • 如果需要在進程池中使用進程間通信Queue,不要使用multiprocessing.Queue()(要求是通過繼承的方式創(chuàng)建的進程),應該使用multiprocessing.Manager.Queue()
  • .close() .terminate()之后一般都建議更上 .join(); .join()之前一定要調(diào)用 .close() .terminate()

進程與線程的對比

定義的不同

  • 進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位

  • 線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他線程共享進程所擁有的全部資源

區(qū)別

  • 一個程序至少有一個進程,一個進程至少有一個線程
  • 線程的劃分尺度小于進程(資源比進度少),使得多線程程序的并發(fā)性高
  • 進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大的提高了程序的運行效率
  • 線程不能獨立執(zhí)行,必須依存在進程中
  • 可以將進程理解為工廠中的一條流水線,而其中的線程就是這個流水線上的工人

優(yōu)缺點

進程和線程在使用上各有優(yōu)缺點,線程執(zhí)行開銷小,但不利于資源的管理個保護;而進程相反

進程簡單的實現(xiàn)文件夾copy器

import os
import time
import multiprocessing


def copy_file(src_path, dest_path, file_name, q):
    """拷貝文件的函數(shù)"""
    f = open(src_path + "/" + file_name, "rb")
    f1 = open(dest_path + "/" + file_name, "wb")
    f1.write(f.read())
    f.close()
    f1.close()
    # 將文件名加入隊列
    q.put(file_name)


if __name__ == '__main__':
    # 使用多進程 完成對指定目錄下的文件拷貝
    # 1.用戶輸入目錄-->源目錄
    src_path = input("輸入你要拷貝的文件名稱:")
    # 2.創(chuàng)建一個新的目錄 存放拷貝之后的文件數(shù)據(jù)
    dest_path = src_path + "[復件]"
    os.mkdir(dest_path)
    # 3.獲取指定目錄下的所有文件信息
    file_list = os.listdir(src_path)
    # 子進程再復制完成文件之后 將文件名寫入隊列 父進程從隊列中取出已經(jīng)完成的文件列表
    q = multiprocessing.Queue()
    # 4.傳入 源目錄 目的目錄 文件名 使用一個子進程完成該文件的拷貝
    for file in file_list:
        pro = multiprocessing.Process(target=copy_file, args=(src_path, dest_path, file, q))
        pro.start()
    # 顯示拷貝進度模塊
    count = 0
    while True:
        file_name = q.get()
        count += 1
        print("\r 當前的進度%.2f %%" % ((count / len(file_list)) * 100), end="")
        time.sleep(0.6)
        if count == len(file_list):
            print("拷貝完成")
            break
# 進程小坑
import multiprocessing


def write():
    print("11")


print("123456")
if __name__ == '__main__':
    pro1 = multiprocessing.Process(target=write)
    pro1.start()


-----運行結果-----
123456
123456
11
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容