本篇文章為大家展示了怎么在python中實(shí)現(xiàn)多線程下信號處理,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺為眾多戶提供綿陽主機(jī)托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。python有哪些常用庫python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。
思路
python多線程中要響應(yīng)Ctrl+C的信號以殺死整個進(jìn)程,需要:
1.把所有子線程設(shè)為Daemon;
2.使用isAlive()函數(shù)判斷所有子線程是否完成,而不是在主線程中用join()函數(shù)等待完成;
3.寫一個響應(yīng)Ctrl+C信號的函數(shù),修改全局變量,使得各子線程能夠檢測到,并正常退出。
源碼
#!/usr/bin/env python #encoding: utf-8 #filename: signal_demo.py import threading, signal def do_job(i, step): global exited idx = i while not exited: if(idx < 10000000): print 'thread[%d]: idx=%d' % (i, idx) idx = idx + step else: break if exited: print 'receive a signal to exit, thread[%d] stop.' % i else: print 'thread[%d] complete.' % i def sig_handler(sig, frame): global exited exited = True print 'receive a signal %d, exited=%d' % (sig, exited) def main(): #set signal handler signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGINT, sig_handler) pool = [] pool_size = 50 for i in range(pool_size): t = threading.Thread(target = do_job, args = (i, pool_size)) t.setDaemon(True) pool.append(t) t.start() while 1: alive = False for i in range(pool_size): alive = alive or pool[i].isAlive() if alive == True: break if not alive: break if __name__ == '__main__': exited = False main()
命令行運(yùn)行
python signal_demo.py
截圖
上述內(nèi)容就是怎么在python中實(shí)現(xiàn)多線程下信號處理,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。