掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
process可以用于node和系統(tǒng)中已經(jīng)存在的進(jìn)程進(jìn)行交互,創(chuàng)建工作子進(jìn)程等,process模塊是一個全局對象,允許你獲得或者修改當(dāng)前node進(jìn)程的設(shè)置。

創(chuàng)新互聯(lián)是專業(yè)的舒蘭網(wǎng)站建設(shè)公司,舒蘭接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行舒蘭網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
process模塊是一個創(chuàng)建進(jìn)程的模塊,借助這個模塊,就可以完成進(jìn)程的創(chuàng)建。
參數(shù)介紹:
Process(group=None, target=None, name=None, args=(), kwargs={})
1 group——參數(shù)未使用,值始終為None
2 target——表示調(diào)用對象,即子進(jìn)程要執(zhí)行的任務(wù)
3 args——表示調(diào)用對象的位置參數(shù)元組,args=(1,2,'egon',)
4 kwargs——表示調(diào)用對象的字典,kwargs={'name':'egon','age':18}
5 name——為子進(jìn)程的名稱
方法介紹:
obj.start():啟動進(jìn)程,并調(diào)用該子進(jìn)程中的obj.run()
obj.run():進(jìn)程啟動時運行的方法,正是它去調(diào)用target指定的函數(shù),我們自定義類的類中一定要實現(xiàn)該方法
obj.terminate():強制終止進(jìn)程obj,不會進(jìn)行任何清理操作,如果obj創(chuàng)建了子進(jìn)程,該子進(jìn)程就成了僵尸進(jìn)程,使用該方法需要特別小心這種情況。如果obj還保存了一個鎖那么也將不會被釋放,進(jìn)而導(dǎo)致死鎖
obj.is_alive():如果obj仍然運行,返回True
obj.join([timeout]):主線程等待obj終止(強調(diào):是主線程處于等的狀態(tài),而obj是處于運行的狀態(tài))。timeout是可選的超時時間,需要強調(diào)的是,obj.join只能join住start開啟的進(jìn)程,而不能join住run開啟的進(jìn)程
屬性介紹:
obj.daemon:默認(rèn)值為False,如果設(shè)為True,代表obj為后臺運行的守護(hù)進(jìn)程,當(dāng)obj的父進(jìn)程終止時,obj也隨之終止,并且設(shè)定為True后,obj不能創(chuàng)建自己的新進(jìn)程,必須在obj.start()之前設(shè)置
obj.name:進(jìn)程的名稱
obj.pid:進(jìn)程的pid
obj.exitcode:進(jìn)程在運行時為None、如果為–N,表示被信號N結(jié)束(了解即可)
obj.authkey:進(jìn)程的身份驗證鍵,默認(rèn)是由os.urandom()隨機生成的32字符的字符串。這個鍵的用途是為涉及網(wǎng)絡(luò)連接的底層進(jìn)程間通信提供安全性,這類連接只有在具有相同的身份驗證鍵時才能成功(了解即可)
from multiprocessing import Process
import os
def func():
print('這是一個子進(jìn)程——>進(jìn)程號:', os.getpid(), ' 主進(jìn)程號:', os.getppid())
if __name__ == '__main__':
print('這是主進(jìn)程——>進(jìn)程號:', os.getpid(), ' 主進(jìn)程號(pycharm):', os.getppid())
# 實例化一個子進(jìn)程對象
obj = Process(target=func)
obj.start() # 執(zhí)行子進(jìn)程對象
print('執(zhí)行了完了主進(jìn)程的內(nèi)容')
# 輸出
這是主進(jìn)程——>進(jìn)程號: 3100 主進(jìn)程號(pycharm): 6748
執(zhí)行了完了主進(jìn)程的內(nèi)容
這是一個子進(jìn)程——>進(jìn)程號: 2392 主進(jìn)程號: 3100
from multiprocessing import Process
import os
def func(name, age):
print('這是一個子進(jìn)程——>進(jìn)程號:', os.getpid(), ' 主進(jìn)程號:', os.getppid())
print(f'這是一個子進(jìn)程——>我的名字是{name},今年{age}')
if __name__ == '__main__':
print('這是主進(jìn)程——>進(jìn)程號:', os.getpid(), ' 主進(jìn)程號(pycharm):', os.getppid())
# 實例化一個子進(jìn)程對象
obj = Process(target=func, args=('小楊', '18')) # args以元組的形式給子進(jìn)程func函數(shù)傳位置參數(shù)
# kwargs以字典的形式給子進(jìn)程func函數(shù)傳關(guān)鍵字參數(shù)
# kwargs={'name': '小楊', 'age': 18}
obj.start() # 執(zhí)行子進(jìn)程對象
print('執(zhí)行了完了主進(jìn)程的內(nèi)容')
# 輸出
這是主進(jìn)程——>進(jìn)程號: 11936 主進(jìn)程號(pycharm): 3676
執(zhí)行了完了主進(jìn)程的內(nèi)容
這是一個子進(jìn)程——>進(jìn)程號: 2996 主進(jìn)程號: 11936
這是一個子進(jìn)程——>我的名字是小楊,今年18
from multiprocessing import Process
import os
def func(name, age):
print(f'這是一個子進(jìn)程——>進(jìn)程號:{os.getpid()},主進(jìn)程號:{os.getppid()},我的名字是{name},今年{age}')
if __name__ == '__main__':
print('這是主進(jìn)程——>進(jìn)程號:', os.getpid(), ' 主進(jìn)程號(pycharm):', os.getppid())
count = [('小楊', 18), ('鮑勃', 20), ('艾倫', 55)]
for lis in count:
# 實例化一個子進(jìn)程對象
obj = Process(target=func, args=lis) # args以元組的形式給子進(jìn)程func函數(shù)傳位置參數(shù)
obj.start() # 執(zhí)行子進(jìn)程對象
print('執(zhí)行了完了主進(jìn)程的內(nèi)容')
# 輸出
這是主進(jìn)程——>進(jìn)程號: 12632 主進(jìn)程號(pycharm): 9220
執(zhí)行了完了主進(jìn)程的內(nèi)容
這是一個子進(jìn)程——>進(jìn)程號:10048,主進(jìn)程號:12632,我的名字是小楊,今年18
這是一個子進(jìn)程——>進(jìn)程號:16032,主進(jìn)程號:12632,我的名字是鮑勃,今年20
這是一個子進(jìn)程——>進(jìn)程號:12060,主進(jìn)程號:12632,我的名字是艾倫,今年55
obj.join([timeout]): 主進(jìn)程等待子進(jìn)程obj終止(強調(diào):是主進(jìn)程處于等的狀態(tài),而子進(jìn)程obj是處于運行的狀態(tài))。timeout是可選的超時時間,需要強調(diào)的是,obj.join只能join住start開啟的進(jìn)程,而不能join住run開啟的進(jìn)程
多個進(jìn)程同時運行(注意,子進(jìn)程的執(zhí)行順序不是根據(jù)啟動順序決定的)
join——>屬于同步阻塞:
同步:在做A事件的時候發(fā)起B(yǎng)事件,必須等待B事件結(jié)束后才能繼續(xù)做A事件
阻塞:CPU不工作——>input accept recv recvfrom sleep connect……
start——>屬于異步非阻塞:
異步:在做A事件的時候發(fā)起B(yǎng)事件,不用等待B事件結(jié)束就可以繼續(xù)A事件
非阻塞:CPU在工作(非輸入輸出階段I/O)
from multiprocessing import Process
import random
import time
def mail(name, age):
count = random.random()
print(f'給{age}歲的{name}發(fā)了一封郵件!延遲{count}秒')
time.sleep(count) # 模擬網(wǎng)絡(luò)延遲
""" 多個進(jìn)程同時運行(注意,子進(jìn)程的執(zhí)行順序不是根據(jù)啟動順序決定的) """
if __name__ == '__main__':
info_list = [('小楊', 18), ('鮑勃', 20), ('艾倫', 55)]
jo = []
for info in info_list:
obj = Process(target=mail, args=info)
obj.start()
jo.append(obj)
# 將所有的子進(jìn)程全部放入jo列表,在循環(huán)join所有子進(jìn)程,就能等待所有子進(jìn)程結(jié)束后在做操作
for o in jo:
o.join()
# 所有的子進(jìn)程結(jié)束的操作
print('全部發(fā)送完畢')
# 輸出
給20歲的鮑勃發(fā)了一封郵件!延遲0.19840279388911186秒
給18歲的小楊發(fā)了一封郵件!延遲0.8891892863366903秒
給55歲的艾倫發(fā)了一封郵件!延遲0.0434307277609951秒
全部發(fā)送完畢
from multiprocessing import Process
count = 1
def func():
global count
count += 1
if __name__ == '__main__':
for i in range(10):
obj = Process(target=func)
obj.start()
print(count) # ————>1 主進(jìn)程的count沒有被改變說明進(jìn)程之間的數(shù)據(jù)時隔離的
# 輸出
1
由于Windows沒有fork,多處理模塊啟動一個新的Python進(jìn)程并導(dǎo)入調(diào)用模塊。
如果在導(dǎo)入時調(diào)用Process(),那么這將啟動無限繼承的新進(jìn)程(或直到機器耗盡資源)。
這是隱藏對Process()內(nèi)部調(diào)用的原,使用if name == ‘main‘:,這個if語句中的語句將不會在導(dǎo)入時被調(diào)用。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流