国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python線程之定位與銷毀的實現

2020-02-16 01:10:49
字體:
來源:轉載
供稿:網友

背景

開工前我就覺得有什么不太對勁,感覺要背鍋。這可不,上班第三天就捅鍋了。

我們有個了不起的后臺程序,可以動態加載模塊,并以線程方式運行,通過這種形式實現插件的功能。而模塊更新時候,后臺程序自身不會退出,只會將模塊對應的線程關閉、更新代碼再啟動,6 得不行。

于是乎我就寫了個模塊準備大展身手,結果忘記寫退出函數了,導致每次更新模塊都新創建一個線程,除非重啟那個程序,否則那些線程就一直茍活著。

這可不行啊,得想個辦法清理呀,要不然怕是要炸了。

那么怎么清理呢?我能想到的就是兩步走:

找出需要清理的線程號 tid; 銷毀它們;

找出線程ID

和平時的故障排查相似,先通過 ps 命令看看目標進程的線程情況,因為已經是 setName 設置過線程名,所以正常來說應該是看到對應的線程的。 直接用下面代碼來模擬這個線程:

Python 版本的多線程

#coding: utf8import threadingimport osimport timedef tt():  info = threading.currentThread()  while True:    print 'pid: ', os.getpid()    print info.name, info.ident    time.sleep(3)t1 = threading.Thread(target=tt)t1.setName('OOOOOPPPPP')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('EEEEEEEEE')t2.setDaemon(True)t2.start()t1.join()t2.join()

輸出:

root@10-46-33-56:~# python t.py
pid: 5613
OOOOOPPPPP 139693508122368
pid: 5613
EEEEEEEEE 139693497632512
...

可以看到在 Python 里面輸出的線程名就是我們設置的那樣,然而 Ps 的結果卻是令我懷疑人生:

root@10-46-33-56:~# ps -Tp 5613
PID SPID TTY TIME CMD
5613 5613 pts/2 00:00:00 python
5613 5614 pts/2 00:00:00 python
5613 5615 pts/2 00:00:00 python

正常來說不該是這樣呀,我有點迷了,難道我一直都是記錯了?用別的語言版本的多線程來測試下:

C 版本的多線程

#include<stdio.h>#include<sys/syscall.h>#include<sys/prctl.h>#include<pthread.h>void *test(void *name){    pid_t pid, tid;  pid = getpid();  tid = syscall(__NR_gettid);  char *tname = (char *)name;    // 設置線程名字  prctl(PR_SET_NAME, tname);    while(1)  {    printf("pid: %d, thread_id: %u, t_name: %s/n", pid, tid, tname);    sleep(3);  }}int main(){  pthread_t t1, t2;  void *ret;  pthread_create(&t1, NULL, test, (void *)"Love_test_1");  pthread_create(&t2, NULL, test, (void *)"Love_test_2");  pthread_join(t1, &ret);  pthread_join(t2, &ret);}

輸出:

root@10-46-33-56:~# gcc t.c -lpthread && ./a.out
pid: 5575, thread_id: 5577, t_name: Love_test_2
pid: 5575, thread_id: 5576, t_name: Love_test_1

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱西市| 咸阳市| 德庆县| 杂多县| 樟树市| 柞水县| 舞钢市| 瑞安市| 当雄县| 吉林省| 津南区| 兰坪| 义马市| 巴塘县| 青神县| 满洲里市| 辽宁省| 荣昌县| 丰镇市| 尖扎县| 夹江县| 河津市| 潢川县| 广安市| 子洲县| 和静县| 鹤岗市| 阿鲁科尔沁旗| 独山县| 台北县| 车致| 商都县| 宁陕县| 海丰县| 舞钢市| 沙雅县| 靖江市| 疏勒县| 姚安县| 嘉峪关市| 神池县|