今天由於便於管理,需要修改多進程(包括子進程)的名稱,網上的資料不多,基本上沒有我想要的案例,今天摸索了下才實現了我的目的,下面具體說一下。
首先,修改進程名,主要依靠一個第三方的模塊:setproctitle 詳情見:https://pypi.org/project/setproctitle/
用法很簡單,基本就兩個方法:
setproctitle(title)
Set title as the title for the current process.
getproctitle()
Return the current process title
我們先來一個例子,如下代碼:
# -*- coding: utf-8 -*-
from multiprocessing import Process
import time
import setproctitle
def task(name):
print("name=",name)
time.sleep(30)
if __name__ == "__main__":
setproctitle.setproctitle('python3 main--')
start = time.time()
p1 = Process(target=task,args=("safly1",),name='python3 safly1')
p2 = Process(target=task, args=("safly2",),name='python3 safly2')
p3 = Process(target=task, args=("safly3",),name='python3 safly3')
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print("main")
print(p1.name)
print(p2.name)
print(p3.name)
end = time.time()
print(end- start)
上面代碼在linux下運行後在終端打印的輸出爲:
輸出沒有問題,我們再通過ps -ef|grep python命令來看下查找出來的結果:
發現,輸出的四個進程爲均爲:python3 main--
父子進程名均爲python3 main--,這是沒問題的,因爲在啓動多進程裏,通過fork出來的子進程的內存空間和父進程是一樣的。
這裏我們需要提醒大家的是,Process(target=task,args=("safly1",),name='python3 safly1') 這裏通過name傳參數的name並不是修改程序在服務器中運行時系統分配的進程名,這裏的name其實就是這個進程環境內的一個屬性,也可以看作是這個進程的內存空間裏的標記吧,僅此而已,實際中很多同學不小心就默認把它當進程名爲對待,這個說法不完全正確。如果需要修改進程在服務器系統中的進程名稱,那可以按如下:
# -*- coding: utf-8 -*-
from multiprocessing import Process
import time
import setproctitle
def task(name):
print("name=",name)
time.sleep(30)
if __name__ == "__main__":
setproctitle.setproctitle('python3 main--')
start = time.time()
p1 = Process(target=task,args=("safly1",),name='python3 safly1')
p2 = Process(target=task, args=("safly2",),name='python3 safly2')
p3 = Process(target=task, args=("safly3",),name='python3 safly3')
p1.start()
setproctitle.setproctitle('python3 main--1')
print(setproctitle.getproctitle())
p2.start()
setproctitle.setproctitle('python3 main--2')
print(setproctitle.getproctitle())
p3.start()
setproctitle.setproctitle('python3 main--3')
print(setproctitle.getproctitle())
p1.join()
p2.join()
p3.join()
print("main")
print(p1.name)
print(p2.name)
print(p3.name)
end = time.time()
print(end- start)
上面代碼在linux終端上的輸出爲:
查找進程信息 ps -ef|grep python3
如上所示,就可以通過命令ps來監控查詢進程了。