python多任務-進程

概念

進程 = 代碼 + 資源
一個程序運行起來就稱之爲進程,進程是一個擁有資源的(進程是一個資源分配的單位)

主進程死了,不影響子進程

知識點:
1、寫時拷貝

代碼實現

import multiprocessing
def test1():
    while True:
        print("1--------")
def test2():
    while True:
        print("2--------")
def main():
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()


子進程傳參

import multiprocessing
import os
def test(a, b, c, *args, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
def main():
    print("----in 主進程 pid=%d---父進程pid=%d----" % (os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm":11})
    p.start()
if __name__ == "__main__":
    main()

進程間相互通信

1、文件 同電腦見的進程通信(基於硬盤)
2、隊列 同電腦見的進程通信(基於內存)
3、socket 不同電腦間的進程通信 (基於網絡)
4、redis

進程池Pool

進程池的使用

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random

def worker(msg):
    t_start = time.time()
    print("%s開始執行,進程號爲%d" % (msg,os.getpid()))
    # random.random()隨機生成0~1之間的浮點數
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"執行完畢,耗時%0.2f" % (t_stop-t_start))

po = Pool(3)  # 定義一個進程池,最大進程數3
for i in range(0,10):
    # Pool().apply_async(要調用的目標,(傳遞給目標的參數元祖,))
    # 每次循環將會用空閒出來的子進程去調用目標
    po.apply_async(worker,(i,))

print("----start----")
po.close()  # 關閉進程池,關閉後po不再接收新的請求
po.join()  # 等待po中所有子進程執行完成,必須放在close語句之後
print("-----end-----")

使用進程池的說明
1、使用進程池開啓多任務,進程池中的主進程不會等待子進程結束才結束,一定要使用po.join()不然進程池中的任務不會執行
2、要使用等待子進程,必須先要關閉進程池po.close()
3、創建進程池的時候如果不指明最大數量,那麼進程池的最大數量將根據系統的最大內存決定。

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