国产探花免费观看_亚洲丰满少妇自慰呻吟_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()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和林格尔县| 新丰县| 沅陵县| 长治县| 赣榆县| 河津市| 灌云县| 东莞市| 静安区| 鄂托克前旗| 化州市| 临泽县| 香港| 青龙| 措美县| 南阳市| 曲沃县| 邻水| 固镇县| 安乡县| 柳林县| 滨州市| 丁青县| 武强县| 兰考县| 汨罗市| 清河县| 台山市| 莒南县| 广东省| 柳州市| 西吉县| 开阳县| 泾阳县| 江门市| 大邑县| 汶上县| 遵化市| 泰和县| 嘉定区| 塘沽区|