1. 程式人生 > 實用技巧 >Python3重新命名程序名/執行緒名實現

Python3重新命名程序名/執行緒名實現

一、環境準備

專案地址:https://github.com/dvarrazzo/py-setproctitle

安裝:pip install setproctitle

二、重新命名程序名

2.1單程序中實現程序重新命名

import setproctitle

# 獲取當前程序名
# Windows可能有問題
proc_title = setproctitle.getproctitle()
print(proc_title)

# 重新命名程序名
proc_title = "new_proc_title"
setproctitle.setproctitle(proc_title)
proc_title 
= setproctitle.getproctitle() print(proc_title)
View Code

2.2多程序中實現程序重新命名

在單程序中重新命名程序名意義並不是很大。在多程序中由於子程序的異常會導致子程序的退出但並不會導致主程序的退出,但由於所有子程序程序名是一樣的我們不好判斷是哪個子程序出了問題。

此時如果重新命名了子程序,我們通過ps就能容易地知道是哪個子程序退出了。

import time
import setproctitle
import multiprocessing


def sub_process(proc_title):
    proc_title_old 
= setproctitle.getproctitle() print(f"proc_title_old: {proc_title_old}") setproctitle.setproctitle(proc_title) proc_title_new = setproctitle.getproctitle() print(f"proc_title_new: {proc_title_new}") # time.sleep(10) def main_process(): process_list = [] # 建立程序1 proc_title = "
python sub_process_1" tmp_process = multiprocessing.Process(target=sub_process,args=(proc_title,)) process_list.append(tmp_process) # 建立程序2 proc_title = "python sub_process_2" tmp_process = multiprocessing.Process(target=sub_process, args=(proc_title,)) process_list.append(tmp_process) # 啟動所有程序 for process in process_list: process.start() for process in process_list: process.join() if __name__ == "__main__": main_process()
View Code

可以看到修改程序名前,父程序及啟動的兩個子程序都是同樣的程序名:

進行修改後,子程序程序名成功改變:

三、重新命名執行緒名

根據setproctitle文件描述,其應該支援getthreadtitle()和setthreadtitle(thread_title)來獲取和設定執行緒名,但現在測試看提示不存在這兩個方法。

3.1執行緒池中自定義執行緒名前輟

執行緒池預設前輟是ThreadPoolExecutor-0,執行緒名就依次是ThreadPoolExecutor-0_0、ThreadPoolExecutor-0_1這樣下去。

可使用ThreadPoolExecutor的thread_name_prefix引數自定義執行緒的前輟。如自定義為my_thread_name,執行緒名就會依次為my_thread_name_0、my_thread_name_1這樣下去。

import time
import threading
from concurrent.futures import ThreadPoolExecutor


class TestClass():
    def __init__(self):
        # 執行緒池+執行緒同步改造新增程式碼處1/5: 定義鎖和執行緒池
        # 我們第二大節中說的是鎖不能線上程類內部例項化,這個是呼叫類不是執行緒類,所以可以在這裡例項化
        self.threadLock = threading.Lock()
        # 定義2個執行緒的執行緒池
        # 使用thread_name_prefix
        self.thread_pool = ThreadPoolExecutor(2, thread_name_prefix="my_thread_name")
        # 定義2個程序的程序池。程序池沒用寫在這裡只想表示程序池的用法和執行緒池基本一樣
        # self.process_pool = ProcessPoolExecutor(2)
        pass

    def main_logic(self):
        for i in range(4):
            # 執行緒池+執行緒同步改造新增程式碼處3/5: 註釋掉原先直接調的do_something的形式,改成通過新增的中間函式呼叫的形式
            # self.do_something(i)
            self.call_do_something(i)
        pass

    # 執行緒池+執行緒同步改造新增程式碼處2/5: 新增一個通過執行緒池呼叫do_something的中間方法。引數與do_something一致
    def call_do_something(self, para):
        self.thread_pool.submit(self.do_something, para)

    def do_something(self, para):
        thread_name = threading.current_thread().name
        # 執行緒池+執行緒同步改造新增程式碼處4/5: 獲取鎖
        self.threadLock.acquire()
        print(f"this is thread : {thread_name}")
        print(f"the parameter value is  : {para}")
        # 執行緒池+執行緒同步改造新增程式碼處5/5: 釋放鎖
        self.threadLock.release()
        time.sleep(1)
        pass


if __name__ == "__main__":
    obj = TestClass()
    obj.main_logic()
View Code