摘要:如果內(nèi)正常打開文件,則清除定時器。在執(zhí)行函數(shù)前設置了,當超出時間后觸發(fā)拋出異常然后捕獲這個異常設置默認值,最后做下清理工作將定時器取消,并且將對的處理設為默認。
signal模塊簡介
最近在看Linux signal 相關內(nèi)容,signal可以被用來進程間通信和異步處理。Python標準庫提供了signal包可以用來處理信號相關。這里討論的是Unix系統(tǒng)中Python的signal模塊。
signal簡單示例官方文檔上有這樣的示例:
import signal, os # 定義一個信號處理函數(shù),該函數(shù)打印收到的信號,然后raise IOError def handler(signum, frame): print "Signal handler called with signal", signum raise IOError("Couldn"t open device!") # 對SIGALRM(終止)設置處理的handler, 然后設置定時器,5秒后觸發(fā)SIGALRM信號 signal.signal(signal.SIGALRM, handler) signal.alarm(5) # This open() may hang indefinitely fd = os.open("/dev/ttyS0", os.O_RDWR) signal.alarm(0) # 關閉定時器
該示例實現(xiàn)的功能是,為了防止打開一個文件出錯或者其他異常一直處于等待的狀態(tài),設定一個定時器,5秒后觸發(fā)IOError。如果5s內(nèi)正常打開文件,則清除定時器。
signal說明 基本的信號名import signal signal.SIGABORT signal.SIGHUP # 連接掛斷 signal.SIGILL # 非法指令 signal.SIGINT # 連接中斷 signal.SIGKILL # 終止進程(此信號不能被捕獲或忽略) signal.SIGQUIT # 終端退出 signal.SIGTERM # 終止 signal.SIGALRM # 超時警告 signal.SIGCONT # 繼續(xù)執(zhí)行暫停進程 等等...常用信號處理函數(shù)
signal.signal(signalnum, handler)
設置信號處理的函數(shù)
signal.alarm(time)
設置發(fā)送SIGALRM信號的定時器
os.kill
這個不屬于signal模塊,但其可以使用給某一進程發(fā)送信號signal使用示例 示例1
# From project httpscreenshot-master, under directory , in source file httpscreenshot.py. def timeoutFn(func, args=(), kwargs={}, timeout_duration=1, default=None): import signal class TimeoutError(Exception): pass def handler(signum, frame): raise TimeoutError() # set the timeout handler signal.signal(signal.SIGALRM, handler) signal.alarm(timeout_duration) try: result = func(*args, **kwargs) except TimeoutError as exc: result = default finally: signal.alarm(0) signal.signal(signal.SIGALRM, signal.SIG_DFL) return result
上面這個示例實現(xiàn)了設置函數(shù)執(zhí)行超時返回默認結(jié)果的功能。先是設置了一個超時處理函數(shù),在函數(shù)中拋出自定義的拋出異常。在執(zhí)行函數(shù)前設置了 signal.alarm ,當超出時間后觸發(fā)拋出異常 SIGALRM, 然后捕獲這個異常設置默認值,最后做下清理工作將定時器取消,并且將對 SIGALRM 的處理設為默認。
示例2這個示例來源于這里。 需求是動態(tài)加載python導入的模塊,也就是說,當導入的模塊代碼更新時,希望可以立即更新引用的代碼。示例如下:
# lib.py def scrape_me_bro(): print "Scraping is fun" #scrape.py import time import signal import lib def scrape(): # Assume we are hitting Streaming API # and doing something buzzwordy with it while True: lib.scrape_me_bro() time.sleep(2) def reload_libs(signum, frame): print "Received Signal: %s at frame: %s" % (signum, frame) print "Excuting a Lib Reload" reload(lib) # Register reload_libs to be called on restart signal.signal(signal.SIGHUP, reload_libs) # Main scrape()
當運行scrape.py時,程序會每個兩秒調(diào)用一次lib.py中的 scrape_me_bro() 方法,這時候如果lib.py里的方法變化了,向運行scrape.py的進程發(fā)送 SIGHUP 信號,那么它會重新加載lib.py,這樣會接著循環(huán)執(zhí)行修改后的 scrape_me_bro() 方法。
參考資料《Beginning Linux Programming》
https://docs.python.org/2/lib...
http://engineerwithoutacause....
http://www.cnblogs.com/vamei/...
http://www.programcreek.com/p...
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44264.html
摘要:倘若該回答是正確的,則立即有如下推論在處理信號的過程中,字節(jié)碼具有原子性。因此,除了在兩個字節(jié)碼之間,應該還有其他時機喚起了。行的是信號處理函數(shù)的最外層包裝,由系統(tǒng)調(diào)用或注冊至內(nèi)核,并在信號發(fā)生時被內(nèi)核回調(diào),是異??刂屏鞯娜肟?。 寫在前面 前幾天工作時遇到了一個匪夷所思的問題。經(jīng)過幾次嘗試后問題得以解決,但問題產(chǎn)生的原因卻仍令人費解。查找 SO 無果,我決定翻看 Python 的源碼。...
摘要:背景這幾天一直在查一個線上程序住的問題這個程序總是在運行分鐘后住通過以下的一些調(diào)試手段發(fā)現(xiàn)是打日志的時候因為滿被了日志是默認打到的無論日志級別而我這個程序是被另一個程序調(diào)起的父進程沒有接收子進程的導致了被打滿在調(diào)試的過程中用到了以下幾種調(diào)試 FROM http://kamushin.github.io/debug/python.html 背景 這幾天一直在查一個線上程序 hang 住的...
摘要:限于,可選的文件描述符序列,用于在父子進程間保持開放。如果設置了,表示派生的進程號子進程返回碼,表示進程未終止。如果未捕獲標準錯誤返回方法如果非,拋出異常異常模塊的異?;愖舆M程執(zhí)行超時。 常量 subprocess.DEVNULL:可傳遞給stdin, stdout, stderr參數(shù)的特殊值,意味著將使用特殊文件os.devnull重定向輸入輸出 subprocess.PIPE:可...
摘要:事件目標是事件想作用的目標。處理事件方面有個機制。這個例子中,我們替換了事件處理器函數(shù)。代表了事件對象。程序展示信號發(fā)送實例能發(fā)送事件信號。我們創(chuàng)建了一個叫的信號,這個信號會在鼠標按下的時候觸發(fā),事件與綁定。 事件和信號 事件 signals and slots 被其他人翻譯成信號和槽機制,(⊙o⊙)…我這里還是不翻譯好了。 所有的應用都是事件驅(qū)動的。事件大部分都是由用戶的行為產(chǎn)生的,...
摘要:序言最近閑暇無事閱讀了一下的源碼對整體的結(jié)構有了初步認識與大家分享不知道為什么右邊的目錄一直出不來非常不舒服不如移步到吧是的核心模塊也是個調(diào)度模塊各種異步事件都是由他調(diào)度的所以必須弄清他的執(zhí)行邏輯源碼分析而的核心部分則是這個循環(huán)內(nèi)部的邏輯貼 序言 最近閑暇無事,閱讀了一下tornado的源碼,對整體的結(jié)構有了初步認識,與大家分享 不知道為什么右邊的目錄一直出不來,非常不舒服. 不如移...
閱讀 2940·2021-11-04 16:06
閱讀 775·2021-09-30 09:56
閱讀 1841·2021-09-22 10:02
閱讀 2622·2019-08-29 13:43
閱讀 2218·2019-08-29 13:42
閱讀 2300·2019-08-29 12:21
閱讀 1056·2019-08-29 11:29
閱讀 1387·2019-08-26 13:51