概念
進程 = 代碼 + 資源
一個程序運行起來就稱之爲進程,進程是一個擁有資源的(進程是一個資源分配的單位)
主進程死了,不影響子進程
知識點:
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、創建進程池的時候如果不指明最大數量,那麼進程池的最大數量將根據系統的最大內存決定。