摘要:如果內(nèi)正常打開(kāi)文件,則清除定時(shí)器。在執(zhí)行函數(shù)前設(shè)置了,當(dāng)超出時(shí)間后觸發(fā)拋出異常然后捕獲這個(gè)異常設(shè)置默認(rèn)值,最后做下清理工作將定時(shí)器取消,并且將對(duì)的處理設(shè)為默認(rèn)。
signal模塊簡(jiǎn)介
最近在看Linux signal 相關(guān)內(nèi)容,signal可以被用來(lái)進(jìn)程間通信和異步處理。Python標(biāo)準(zhǔn)庫(kù)提供了signal包可以用來(lái)處理信號(hào)相關(guān)。這里討論的是Unix系統(tǒng)中Python的signal模塊。
signal簡(jiǎn)單示例官方文檔上有這樣的示例:
import signal, os # 定義一個(gè)信號(hào)處理函數(shù),該函數(shù)打印收到的信號(hào),然后raise IOError def handler(signum, frame): print "Signal handler called with signal", signum raise IOError("Couldn"t open device!") # 對(duì)SIGALRM(終止)設(shè)置處理的handler, 然后設(shè)置定時(shí)器,5秒后觸發(fā)SIGALRM信號(hào) signal.signal(signal.SIGALRM, handler) signal.alarm(5) # This open() may hang indefinitely fd = os.open("/dev/ttyS0", os.O_RDWR) signal.alarm(0) # 關(guān)閉定時(shí)器
該示例實(shí)現(xiàn)的功能是,為了防止打開(kāi)一個(gè)文件出錯(cuò)或者其他異常一直處于等待的狀態(tài),設(shè)定一個(gè)定時(shí)器,5秒后觸發(fā)IOError。如果5s內(nèi)正常打開(kāi)文件,則清除定時(shí)器。
signal說(shuō)明 基本的信號(hào)名import signal signal.SIGABORT signal.SIGHUP # 連接掛斷 signal.SIGILL # 非法指令 signal.SIGINT # 連接中斷 signal.SIGKILL # 終止進(jìn)程(此信號(hào)不能被捕獲或忽略) signal.SIGQUIT # 終端退出 signal.SIGTERM # 終止 signal.SIGALRM # 超時(shí)警告 signal.SIGCONT # 繼續(xù)執(zhí)行暫停進(jìn)程 等等...常用信號(hào)處理函數(shù)
signal.signal(signalnum, handler)
設(shè)置信號(hào)處理的函數(shù)
signal.alarm(time)
設(shè)置發(fā)送SIGALRM信號(hào)的定時(shí)器
os.kill
這個(gè)不屬于signal模塊,但其可以使用給某一進(jìn)程發(fā)送信號(hào)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
上面這個(gè)示例實(shí)現(xiàn)了設(shè)置函數(shù)執(zhí)行超時(shí)返回默認(rèn)結(jié)果的功能。先是設(shè)置了一個(gè)超時(shí)處理函數(shù),在函數(shù)中拋出自定義的拋出異常。在執(zhí)行函數(shù)前設(shè)置了 signal.alarm ,當(dāng)超出時(shí)間后觸發(fā)拋出異常 SIGALRM, 然后捕獲這個(gè)異常設(shè)置默認(rèn)值,最后做下清理工作將定時(shí)器取消,并且將對(duì) SIGALRM 的處理設(shè)為默認(rèn)。
示例2這個(gè)示例來(lái)源于這里。 需求是動(dòng)態(tài)加載python導(dǎo)入的模塊,也就是說(shuō),當(dāng)導(dǎo)入的模塊代碼更新時(shí),希望可以立即更新引用的代碼。示例如下:
# 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()
當(dāng)運(yùn)行scrape.py時(shí),程序會(huì)每個(gè)兩秒調(diào)用一次lib.py中的 scrape_me_bro() 方法,這時(shí)候如果lib.py里的方法變化了,向運(yùn)行scrape.py的進(jìn)程發(fā)送 SIGHUP 信號(hào),那么它會(huì)重新加載lib.py,這樣會(huì)接著循環(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...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44264.html
摘要:倘若該回答是正確的,則立即有如下推論在處理信號(hào)的過(guò)程中,字節(jié)碼具有原子性。因此,除了在兩個(gè)字節(jié)碼之間,應(yīng)該還有其他時(shí)機(jī)喚起了。行的是信號(hào)處理函數(shù)的最外層包裝,由系統(tǒng)調(diào)用或注冊(cè)至內(nèi)核,并在信號(hào)發(fā)生時(shí)被內(nèi)核回調(diào),是異??刂屏鞯娜肟凇? 寫(xiě)在前面 前幾天工作時(shí)遇到了一個(gè)匪夷所思的問(wèn)題。經(jīng)過(guò)幾次嘗試后問(wèn)題得以解決,但問(wèn)題產(chǎn)生的原因卻仍令人費(fèi)解。查找 SO 無(wú)果,我決定翻看 Python 的源碼。...
摘要:背景這幾天一直在查一個(gè)線上程序住的問(wèn)題這個(gè)程序總是在運(yùn)行分鐘后住通過(guò)以下的一些調(diào)試手段發(fā)現(xiàn)是打日志的時(shí)候因?yàn)闈M被了日志是默認(rèn)打到的無(wú)論日志級(jí)別而我這個(gè)程序是被另一個(gè)程序調(diào)起的父進(jìn)程沒(méi)有接收子進(jìn)程的導(dǎo)致了被打滿在調(diào)試的過(guò)程中用到了以下幾種調(diào)試 FROM http://kamushin.github.io/debug/python.html 背景 這幾天一直在查一個(gè)線上程序 hang 住的...
摘要:限于,可選的文件描述符序列,用于在父子進(jìn)程間保持開(kāi)放。如果設(shè)置了,表示派生的進(jìn)程號(hào)子進(jìn)程返回碼,表示進(jìn)程未終止。如果未捕獲標(biāo)準(zhǔn)錯(cuò)誤返回方法如果非,拋出異常異常模塊的異?;?lèi)子進(jìn)程執(zhí)行超時(shí)。 常量 subprocess.DEVNULL:可傳遞給stdin, stdout, stderr參數(shù)的特殊值,意味著將使用特殊文件os.devnull重定向輸入輸出 subprocess.PIPE:可...
摘要:事件目標(biāo)是事件想作用的目標(biāo)。處理事件方面有個(gè)機(jī)制。這個(gè)例子中,我們替換了事件處理器函數(shù)。代表了事件對(duì)象。程序展示信號(hào)發(fā)送實(shí)例能發(fā)送事件信號(hào)。我們創(chuàng)建了一個(gè)叫的信號(hào),這個(gè)信號(hào)會(huì)在鼠標(biāo)按下的時(shí)候觸發(fā),事件與綁定。 事件和信號(hào) 事件 signals and slots 被其他人翻譯成信號(hào)和槽機(jī)制,(⊙o⊙)…我這里還是不翻譯好了。 所有的應(yīng)用都是事件驅(qū)動(dòng)的。事件大部分都是由用戶的行為產(chǎn)生的,...
摘要:序言最近閑暇無(wú)事閱讀了一下的源碼對(duì)整體的結(jié)構(gòu)有了初步認(rèn)識(shí)與大家分享不知道為什么右邊的目錄一直出不來(lái)非常不舒服不如移步到吧是的核心模塊也是個(gè)調(diào)度模塊各種異步事件都是由他調(diào)度的所以必須弄清他的執(zhí)行邏輯源碼分析而的核心部分則是這個(gè)循環(huán)內(nèi)部的邏輯貼 序言 最近閑暇無(wú)事,閱讀了一下tornado的源碼,對(duì)整體的結(jié)構(gòu)有了初步認(rèn)識(shí),與大家分享 不知道為什么右邊的目錄一直出不來(lái),非常不舒服. 不如移...
閱讀 2995·2021-11-04 16:06
閱讀 836·2021-09-30 09:56
閱讀 1891·2021-09-22 10:02
閱讀 2668·2019-08-29 13:43
閱讀 2284·2019-08-29 13:42
閱讀 2365·2019-08-29 12:21
閱讀 1118·2019-08-29 11:29
閱讀 1440·2019-08-26 13:51