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

首頁 > 編程 > Python > 正文

Python中用Ctrl+C終止多線程程序的問題解決

2020-02-23 04:54:34
字體:
來源:轉載
供稿:網友

代碼如下:
#!/bin/env python
 # -*- coding: utf-8 -*-
 #filename: peartest.py

 import threading, signal

 is_exit = False

 def doStress(i, cc):
     global is_exit
     idx = i
     while not is_exit:
         if (idx < 10000000):
             print "thread[%d]: idx=%d"%(i, idx)
             idx = idx + cc
         else:
             break
     print "thread[%d] complete."%i

 def handler(signum, frame):
     global is_exit
     is_exit = True
     print "receive a signal %d, is_exit = %d"%(signum, is_exit)

 if __name__ == "__main__":
     signal.signal(signal.SIGINT, handler)
     signal.signal(signal.SIGTERM, handler)
     cc = 5
     for i in range(cc):
         t = threading.Thread(target=doStress, args=(i,cc))
         t.start()

上面是一個模擬程序,并不真正向服務發送請求,而代之以在一千萬以內,每個線程每隔并發數個(cc個)打印一個整數。很明顯,當所有線程都完成自己的任務后,進程會正常退出。但如果我們中途想退出(試想一個壓力測試程序,在中途已經發現了問題,需要停止測試),該腫么辦?你當然可以用ps查找到進程號,然后kill -9殺掉,但這樣太繁瑣了,捕捉Ctrl+C是最自然的想法。上面示例程序中已經捕捉了這個信號,并修改全局變量is_exit,線程中會檢測這個變量,及時退出。

但事實上這個程序并不work,當你按下Ctrl+C時,程序照常運行,并無任何響應。網上搜了一些資料,明白是python的子線程如果不是daemon的話,主線程是不能響應任何中斷的。但設為daemon后主線程會隨之退出,接著整個進程很快就退出了,所以還需要在主線程中檢測各個子線程的狀態,直到所有子線程退出后自己才退出,因此上例29行之后的代碼可以修改為:

代碼如下:
threads=[]
     for i in range(cc):
         t = threading.Thread(target=doStress, args=(i, cc))
         t.setDaemon(True)
         threads.append(t)
         t.start()
     for i in range(cc):
         threads[i].join()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝南县| 垦利县| 安龙县| 冷水江市| 安庆市| 石渠县| 莱州市| 渝中区| 定兴县| 金平| 灵武市| 蛟河市| 界首市| 灯塔市| 梁平县| 兴城市| 香港| 连平县| 天峨县| 嵊泗县| 故城县| 昂仁县| 大安市| 乌鲁木齐市| 资中县| 高雄县| 新邵县| 仁化县| 鄂伦春自治旗| 侯马市| 宽城| 乐平市| 庆安县| 菏泽市| 龙山县| 怀远县| 巴彦淖尔市| 二连浩特市| 阿克苏市| 克拉玛依市| 乡宁县|