99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python信號 (signal包,部分os包)
Python信號 (signal包,部分os包)
2017-04-17
收藏

Python信號 (signal包,部分os包)

在了解了Linux的信號基礎之后,Python標準庫中的signal包就很容易學習和理解。signal包負責在Python程序內(nèi)部處理信號,典型的操作包括預設信號處理函數(shù),暫停并等待信號,以及定時發(fā)出SIGALRM等。要注意,signal包主要是針對UNIX平臺(比如Linux, MAC OS),而Windows內(nèi)核中由于對信號機制的支持不充分,所以在Windows上的Python不能發(fā)揮信號系統(tǒng)的功能。
定義信號名
signal包定義了各個信號名及其對應的整數(shù),比如
import signal
print signal.SIGALRM
print signal.SIGCONT
Python所用的信號名和Linux一致。你可以通過
$man 7 signal
查詢
預設信號處理函數(shù)
signal包的核心是使用signal.signal()函數(shù)來預設(register)信號處理函數(shù),如下所示:
singnal.signal(signalnum, handler)
signalnum為某個信號,handler為該信號的處理函數(shù)。我們在信號基礎里提到,進程可以無視信號,可以采取默認操作,還可以自定義操作。當handler為signal.SIG_IGN時,信號被無視(ignore)。當handler為singal.SIG_DFL,進程采取默認操作(default)。當handler為一個函數(shù)名時,進程采取函數(shù)中定義的操作。
import signal
# Define signal handler function
def myHandler(signum, frame):
    print('I received: ', signum)

# register signal.SIGTSTP's handler
signal.signal(signal.SIGTSTP, myHandler)
signal.pause()
print('End of Signal Demo')
在主程序中,我們首先使用signal.signal()函數(shù)來預設信號處理函數(shù)。然后我們執(zhí)行signal.pause()來讓該進程暫停以等待信號,以等待信號。當信號SIGUSR1被傳遞給該進程時,進程從暫停中恢復,并根據(jù)預設,執(zhí)行SIGTSTP的信號處理函數(shù)myHandler()。myHandler的兩個參數(shù)一個用來識別信號(signum),另一個用來獲得信號發(fā)生時,進程棧的狀況(stack frame)。這兩個參數(shù)都是由signal.singnal()函數(shù)來傳遞的。
上面的程序可以保存在一個文件中(比如test.py)。我們使用如下方法運行:
$python test.py
以便讓進程運行。當程序運行到signal.pause()的時候,進程暫停并等待信號。此時,通過按下CTRL+Z向該進程發(fā)送SIGTSTP信號。我們可以看到,進程執(zhí)行了myHandle()函數(shù), 隨后返回主程序,繼續(xù)執(zhí)行。(當然,也可以用$ps查詢process ID, 再使用$kill來發(fā)出信號。)
(進程并不一定要使用signal.pause()暫停以等待信號,它也可以在進行工作中接受信號,比如將上面的signal.pause()改為一個需要長時間工作的循環(huán)。)
我們可以根據(jù)自己的需要更改myHandler()中的操作,以針對不同的信號實現(xiàn)個性化的處理。
定時發(fā)出SIGALRM信號
一個有用的函數(shù)是signal.alarm(),它被用于在一定時間之后,向進程自身發(fā)送SIGALRM信號:
import signal
# Define signal handler function
def myHandler(signum, frame):
    print("Now, it's the time")
    exit()

# register signal.SIGALRM's handler
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:
    print('not yet')
我們這里用了一個無限循環(huán)以便讓進程持續(xù)運行。在signal.alarm()執(zhí)行5秒之后,進程將向自己發(fā)出SIGALRM信號,隨后,信號處理函數(shù)myHandler開始執(zhí)行。
發(fā)送信號
signal包的核心是設置信號處理函數(shù)。除了signal.alarm()向自身發(fā)送信號之外,并沒有其他發(fā)送信號的功能。但在os包中,有類似于linux的kill命令的函數(shù),分別為
os.kill(pid, sid)
os.killpg(pgid, sid)
分別向進程和進程組(見Linux進程關系)發(fā)送信號。sid為信號所對應的整數(shù)或者singal.SIG*。
實際上signal, pause,kill和alarm都是Linux應用編程中常見的C庫函數(shù),在這里,我們只不過是用Python語言來實現(xiàn)了一下。實際上,Python 的解釋器是使用C語言來編寫的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增強,信號阻塞等功能被加入到該包中。我們暫時不深入到該包中。數(shù)據(jù)分析師培訓
總結
signal.SIG*
signal.signal()
signal.pause()
signal.alarm()

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }