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

熱線電話:13121318867

登錄
首頁精彩閱讀python中日志logging模塊的性能及多進(jìn)程詳解
python中日志logging模塊的性能及多進(jìn)程詳解
2018-05-17
收藏

python中日志logging模塊的性能及多進(jìn)程詳解

使用Python來寫后臺(tái)任務(wù)時(shí),時(shí)常需要使用輸出日志來記錄程序運(yùn)行的狀態(tài),并在發(fā)生錯(cuò)誤時(shí)將錯(cuò)誤的詳細(xì)信息保存下來,以別調(diào)試和分析。Python的logging模塊就是這種情況下的好幫手。本文就介紹了python中日志logging模塊性能及多進(jìn)程的相關(guān)資料,需要的朋友可以參考下。


Java 中最通用的日志模塊莫過于 Log4j 了,在 python 中,也自帶了 logging 模塊,該模塊的用法其實(shí)和 Log4j 類似。日志是記錄操作的一種好方式。但是日志,基本都是基于文件的,也就是要寫到磁盤上的。這時(shí)候,磁盤將會(huì)成為一個(gè)性能瓶頸。對于普通的服務(wù)器硬盤(機(jī)械磁盤,非固態(tài)硬盤),Python日志的性能瓶頸是多少呢?今天我們就來測一下。下面話不多說,來一起看看詳細(xì)的介紹:

測試代碼如下:

#! /usr/bin/env python
#coding=utf-8
  
# ============================
# Describe : 給平臺(tái)提供的日志
# D&P Author By:  常成功
# Create Date:  2016/08/01
# Modify Date:  2016/08/01
# ============================
  
importtime
importos
importlogging
  
  
print"Start test ...."
s_tm=time.time()
test_time=10.0# 測試時(shí)間10秒
e_tm=s_tm+10
j=0
  
pid=str(os.getpid())
while1:
 now_time=time.time()
 j+=1
 ifnow_time > e_tm:
  break
 # 生成文件夾
 lujing="d:\\test_log"
 ifnotos.path.exists(lujing):
  os.mkdir(lujing)
  
 fm2='%Y%m%d'
 YMD=time.strftime(fm2, time.localtime(now_time))
  
 filename='recharge_'+YMD+'.log'
 log_file=os.path.join(lujing, filename)
 t="\t"
 log_msg=str(j)+t+str(now_time)+t+pid
  
 the_logger=logging.getLogger('recharge_log')
 f_handler=logging.FileHandler(log_file)
 the_logger.addHandler(f_handler)
 the_logger.setLevel(logging.INFO)
 # To pass exception information, use the keyword argument exc_info with a true value
 the_logger.info(log_msg, exc_info=False)
 the_logger.removeHandler(f_handler)
  
rps=j/test_time
printrps,"rows per second"

結(jié)果為:

Start test ....

2973.0 rows per second

Python的logging性能:

7200轉(zhuǎn)的機(jī)械磁盤,測了幾次,每秒的能寫入日志的行數(shù)(每行就是一條日志),數(shù)量基本在 2800-3000 之間。此時(shí),磁盤IO基本已經(jīng)跑滿。(在3.3Ghz的CPU上,CPU占用大約40%)。

Python的logging多進(jìn)程:

python 的 logging模塊,是線程安全的。但對于多進(jìn)程的程序來說,怎么去寫日志文件呢?我的解決辦法是,每個(gè)進(jìn)程的PID,寫一個(gè)單獨(dú)的日志文件。再用算法把所有進(jìn)程的日志合并起來,生成新的日志。

提示:由于磁盤IO已經(jīng)到達(dá)瓶頸,所以多進(jìn)程并不能提高日志性能。高性能日志,需要用緩存,或者分布式日志。

總結(jié)

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助.


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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(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)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(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ù)說明請參見: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 = '請輸入'+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); }