1.fork函數(shù)
此處需要注意的是
當(dāng)調(diào)用fork方法 铃诬,之后的代碼會運(yùn)行兩次
os 中的fork只能在liunx中使用
fork方法有一個(gè)返回值。若為0表示子進(jìn)程
獲取子進(jìn)程的編號 os.getpid 獲取父進(jìn)程的編號
實(shí)例:
"""
os 中的fork只能在liunx中使用
"""
import os
print("daima")
# 運(yùn)行一個(gè)子進(jìn)程
# 當(dāng)調(diào)用fork方法 古程,之后的代碼會運(yùn)行兩次
re = os.fork()
print("res = ",re)
# fork方法有一個(gè)返回值谈截。若為0表示子進(jìn)程
if re == 0:
# 獲取子進(jìn)程的編號 os.getpid 獲取父進(jìn)程的編號os.getppid
print("子",os.getpid(),os.getppid())
else:
print("主",os.getpid())
print("代碼完成")
======================================================
os.fork()
os.getpid()
os.getppid()
2.全局變量問題
全局變量不共享玖院,進(jìn)程獨(dú)自占有一份
實(shí)例:
import os
num = 10
def sum1():
print("111")
global num
num += 10
print("unm")
def sum2():
print("22222")
global num
num += 10
print(num)
res = os.fork()
if res == 0:
print("子進(jìn)程運(yùn)行")
sum1()
else:
print("主進(jìn)程運(yùn)行")
sum2()
print("程序運(yùn)行結(jié)束")
3.多個(gè)fork問題
遇見fork將一個(gè)進(jìn)程開辟成兩個(gè)
實(shí)例
import os
res = os.fork()
if res == 0:
print("1")
else:
print("2")
res2 = os.fork()
if res2 == 0:
print("3")
else:
print("4")
print("程序運(yùn)行結(jié)束")
運(yùn)行結(jié)果
4.window環(huán)境下使用multiprocessing
我們使用os.fork()方法實(shí)現(xiàn)了多進(jìn)程,但是這種方案只能在Linux下運(yùn)行律杠,window環(huán)境下是無法運(yùn)行的潭流,那么有沒有可以實(shí)現(xiàn)在任何平臺都能運(yùn)行的多進(jìn)程了竞惋,有!Python為大家提供了multiprocessing模塊用來實(shí)現(xiàn)多進(jìn)程灰嫉。
multiprocessing模塊實(shí)例:
主進(jìn)程不變拆宛,創(chuàng)建子進(jìn)程
from multiprocessing import Process
import time
import os
def download(path):
print("開始下載")
for x in range(5):
print("%s開始下載中……" %path)
print(os.getpid())
print(os.getppid())
time.sleep(1)
print("下載結(jié)束")
def printMsg(msg):
print("開始打印")
for x in range(5):
print("打印中……%s" % msg)
print(os.getpid())
print(os.getppid())
time.sleep(1)
print("打印結(jié)束")
if __name__ == '__main__':
start_time = time.time()
print("程序開始運(yùn)行了")
# download("www.xxx.com")
# 多進(jìn)程
# 構(gòu)建進(jìn)程對象
t1 = Process(target=download, args=("www.xxx.com",), name="download")
# 啟動進(jìn)程
t1.start()
# 構(gòu)建進(jìn)程對象
t2 = Process(target=printMsg, args=("劉建宏真帥,今天天氣真熱K先觥浑厚!",), name="print")
# 啟動進(jìn)程
t2.start()
print("程序結(jié)束", time.time() - start_time)
運(yùn)行結(jié)果
5.多進(jìn)程中常見方法
啟動進(jìn)程
t1.start()
守護(hù)進(jìn)程放在start之前 ,把這個(gè)進(jìn)程注冊成守護(hù)進(jìn)行
守護(hù)進(jìn)程依賴于主進(jìn)程存活根盒,主進(jìn)程結(jié)束守護(hù)進(jìn)程結(jié)束
t1.daemon = True
獲取進(jìn)程名稱.在多進(jìn)程中钳幅,子進(jìn)程名字默認(rèn)是Process - n
print(t1.name)
判斷進(jìn)程是否被殺死
if t1.is_alive():
print(t1.is_alive())
殺死進(jìn)程
t1.terminate()
進(jìn)程對象的join方法,使主進(jìn)程等待當(dāng)前子進(jìn)程運(yùn)行結(jié)束后再進(jìn)行運(yùn)行
t1.join()
綜合實(shí)例:
def run(msg):
for x in range(10):
print("一個(gè)子進(jìn)程")
print(msg)
print("子進(jìn)程結(jié)束")
time.sleep(1)
if __name__ == '__main__':
print("主進(jìn)程開始")
t1 = Process(target=run, args="1", name="zi")
t2 = Process(target=run, args="2", name="zi1")
# 守護(hù)進(jìn)程放在start之前 炎滞,把這個(gè)進(jìn)程注冊成守護(hù)進(jìn)行
# 守護(hù)進(jìn)程依賴于主進(jìn)程存活敢艰,主進(jìn)程結(jié)束守護(hù)進(jìn)程結(jié)束
t1.daemon = True
# 啟動進(jìn)程
t1.start()
t2.start()
# 獲取進(jìn)程名稱
# 在多進(jìn)程中,子進(jìn)程名字默認(rèn)是Process - n
print(t1.name)
print(t2.name)
# 判斷進(jìn)程是否被殺死
if t1.is_alive():
print(t1.is_alive())
# 殺死進(jìn)程
t1.terminate()
# 進(jìn)程對象的join方法厂榛,使主進(jìn)程等待當(dāng)前
# 子進(jìn)程運(yùn)行結(jié)束后再進(jìn)行運(yùn)行
t1.join()
print("zhu")
6.進(jìn)程類
進(jìn)程的實(shí)現(xiàn):
1.需要基礎(chǔ)multiprocessing模塊中Process類
2.重寫run方法盖矫,run方法就是我們要執(zhí)行的方法
from multiprocessing import Process
import time
"""
進(jìn)程的實(shí)現(xiàn):
1.需要基礎(chǔ)multiprocessing模塊中Process類
2.重寫run方法,run方法就是我們要執(zhí)行的方法
"""
class MyProcess(Process):
def __init__(self, name, age):
# 第一個(gè)參數(shù)是進(jìn)程的名字不能寫成普通參數(shù)击奶,固定寫法
super().__init__(name=name)
self.age = age
# RUN方法就是進(jìn)程需要的執(zhí)行的方法
def run(self):
print("獨(dú)立子進(jìn)程")
time.sleep(1)
print("子進(jìn)程結(jié)束")
if __name__ == '__main__':
print("主進(jìn)程開始")
m1 = MyProcess("1", "2")
m1.start()
print("主進(jìn)程結(jié)束")