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

熱線(xiàn)電話(huà):13121318867

登錄
首頁(yè)精彩閱讀python多線(xiàn)程編程中的join函數(shù)使用心得
python多線(xiàn)程編程中的join函數(shù)使用心得
2018-02-06
收藏

python多線(xiàn)程編程中的join函數(shù)使用心得

今天去辛集買(mǎi)箱包,下午挺晚才回來(lái),又是惡心又是頭痛。惡心是因?yàn)樵缟铣詨臇|西+暈車(chē)+回來(lái)時(shí)看到車(chē)禍現(xiàn)場(chǎng),頭痛大概是烈日和空調(diào)混合刺激而成。沒(méi)有時(shí)間沒(méi)有精神沒(méi)有力氣學(xué)習(xí)了,這篇博客就說(shuō)說(shuō)python中一個(gè)小小函數(shù)。

由于坑爹的學(xué)??訝?shù)膶?zhuān)業(yè),多線(xiàn)程編程老師從來(lái)沒(méi)教過(guò),多線(xiàn)程的概念也是教的稀里糊涂,本人python也是菜鳥(niǎo)級(jí)別,所以遇到多線(xiàn)程的編程就傻眼了,別人用的順手的join函數(shù)我卻偏偏理解不來(lái)。早上在去辛集的路上想這個(gè)問(wèn)題想到惡心,回來(lái)后繼續(xù)寫(xiě)代碼測(cè)試,終于有些理解了(python官方的英文解釋理解不了,網(wǎng)友的解釋也不夠詳細(xì),只能自己鉆)。
測(cè)試用的代碼如下:

代碼如下:
# coding: utf-8

# 測(cè)試多線(xiàn)程中join的功能

import threading, time 
def doWaiting(): 
    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n" 
    time.sleep(3) 
    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"
def doWaiting1(): 
    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"  
    time.sleep(8) 
    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 
tsk = []   
thread1 = threading.Thread(target = doWaiting) 
thread1.start() 
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1) 
thread2.start() 
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n"  
for tt in tsk:
    tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

這個(gè)小程序使用了兩個(gè)線(xiàn)程thread1和thread2,線(xiàn)程執(zhí)行的動(dòng)作分別是doWaiting()和doWaiting1(),函數(shù)體就是打印「開(kāi)始」+休眠3秒+打印「結(jié)束」,分別附加上時(shí)間用來(lái)查看程序執(zhí)行的過(guò)程。后面用start()方法同步開(kāi)始執(zhí)行兩個(gè)線(xiàn)程。然后開(kāi)始循環(huán)調(diào)用兩個(gè)線(xiàn)程的join()方法,在此之前和之后都會(huì)用print函數(shù)做好開(kāi)始結(jié)束的標(biāo)記。我們主要觀(guān)察for tt in tsk: tt.join()。

join()不帶參數(shù)的情況下,執(zhí)行如下:

可以看到,兩個(gè)線(xiàn)程并行執(zhí)行,進(jìn)程1在3s后結(jié)束,進(jìn)程2在8s后結(jié)束,然后回到主進(jìn)程,執(zhí)行打印「end join」。

下面把參數(shù)設(shè)置成超時(shí)2s,即tt.join(2),執(zhí)行如下:

兩個(gè)線(xiàn)程開(kāi)始并發(fā)執(zhí)行,然后執(zhí)行線(xiàn)程1的join(2),等線(xiàn)程1執(zhí)行2s后就不管它了,執(zhí)行線(xiàn)程2的join(2),等線(xiàn)程2執(zhí)行2s后也不管它了(在此過(guò)程中線(xiàn)程1執(zhí)行結(jié)束,打印線(xiàn)程1的結(jié)束信息),開(kāi)始執(zhí)行主進(jìn)程,打印「end join」。4s之后線(xiàn)程2執(zhí)行結(jié)束。

總結(jié)一下:

1.join方法的作用是阻塞主進(jìn)程(擋住,無(wú)法執(zhí)行join以后的語(yǔ)句),專(zhuān)注執(zhí)行多線(xiàn)程。

2.多線(xiàn)程多join的情況下,依次執(zhí)行各線(xiàn)程的join方法,前頭一個(gè)結(jié)束了才能執(zhí)行后面一個(gè)。

3.無(wú)參數(shù),則等待到該線(xiàn)程結(jié)束,才開(kāi)始執(zhí)行下一個(gè)線(xiàn)程的join。

4.設(shè)置參數(shù)后,則等待該線(xiàn)程這么長(zhǎng)時(shí)間就不管它了(而該線(xiàn)程并沒(méi)有結(jié)束)。不管的意思就是可以執(zhí)行后面的主進(jìn)程了。

最后附上參數(shù)為2時(shí)的程序執(zhí)行流程表,自己畫(huà)的orz,這樣看起來(lái)更好理解。


數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

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

OK
客服在線(xiàn)
立即咨詢(xún)
客服在線(xiàn)
立即咨詢(xún)
') } 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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }