电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python 解決logging功能使用過程中遇到的一個問題

瀏覽:4日期:2022-06-22 13:40:38
現象:

生產中心進行拷機任務下了300個任務,過了一陣時間后發現任務不再被調度起來,查看后臺日志發現日志輸出停在某個時間點。

分析:

1、首先確認進程存在并沒有dead。

2、然后用strace ?p看了一下進程,發現進程卡在futex調用上面,應該是在鎖操作上面出問題了。

3、用gdb attach進程ID,用py-bt查看一下堆棧,發現堆棧的信息大致為:sig_handler(某個信號處理函數)->auroralogger(自定義的日志函數)->logging(python的logging模塊)->threading.acquire(獲取鎖)。從gdb的bt信息基本驗證了上面的猜想,應該是出現了死鎖。

4、Python的logging模塊本身肯定不會有死鎖的這種bug有可能出問題的就是我們的使用方式,看python中logging模塊的doc,發現有一個有一個Thread Safety的章節,內容很簡單但是也一下就解釋了我遇到的這個問題,內容如下:

The logging module is intended to be thread-safe without any special work needing to be done by its clients. It achieves this though using threading locks; there is one lock to serialize access to the module’s shared data, and each handler also creates a lock to serialize access to its underlying I/O.

If you are implementing asynchronous signal handlers using the signal module, you may not be able to use logging from within such handlers. This is because lock implementations in the threading module are not always re-entrant, and so cannot be invoked from such signal handlers.

第一部分是說logging是線程安全的,通過threading的lock對公用的數據進行了加鎖。

第二部分特意提到了在異步的信號處理函數中不能使用logging模塊,因為threading的lock機制是不支持重入的。

這樣就解釋了上面我遇到的死鎖問題,因為我在信號處理函數中調用了不可以重入的logging模塊。

線程安全和可重入:

從上面的logging模塊來看線程安全和可重入不是等價的,那么這兩個概念之間有什么聯系、區別呢?

1、可重入函數:從字面意思來理解就是這個函數可以重復調用,函數被多個線程亂序執行甚至交錯執行都能保證函數的輸出和函數單獨被執行一次的輸出一致。也就是說函數的輸出只決定于輸入。

線程安全函數:函數可以被多個線程調用,并且保證不會引用到錯誤的或者臟的數據。線程安全的函數輸出不僅僅依賴于輸入還可能依賴于被調用時的順序。

2、可重入函數和線程安全函數之間有一個最大的差異是:是否是異步信號安全。可重入函數在異步信號處理函數中可以被安全調用,而線程安全函數不保證可以在異步信號處理函數中被安全調用。

上面我們遇到的loggin模塊就是非異步信號安全的,在主線程中我們正在使用log函數而log函數調用了threading.lock來獲取到了鎖,此時一個異步信號產生程序跳轉到信號處理函數中,信號處理函數又正好調用了log函數,因為前一個被調用的log函數還未釋放鎖,最后就形成了一個死鎖。

1、可重入函數必然是線程安全函數和異步信號安全函數,線程安全函數不一定是可重入函數。

總結:

異步信號處理函數中一定要盡可能的功能簡單并且不能調用不可重入的函數。

Python loggin模塊是線程安全但是是不可重入的。

補充:Python—logging模塊使用教程

簡單用法日志等級級別 何時使用 DEBUG 細節信息,僅當診斷問題時適用。 INFO 確認程序按預期運行 WARNING 表明有已經或即將發生的意外(例如:磁盤空間不足)。程序仍按預期進行 ERROR 由于嚴重的問題,程序的某些功能已經不能正常執行 CRITICAL 嚴重的錯誤,表明程序已不能繼續執行 控制臺輸出日志

import logginglogging.warning(’Watch out!’) logging.info(’I told you so’) 將日志保存到文件并且設置時間和輸出格式

import logging# 保存文件為example.log,記錄等級為DEBUG,即只記錄DENBUG及以上的日志# 輸出格式為 2019-19-06 18:47:06 - WARNING - And this, toologging.basicConfig( filename=’example.log’, filemode=’w’, level=logging.DEBUG, format=’%(asctime)s - %(levelname)s - %(message)s’, datefmt=’%Y-%d-%d %H:%M:%S’)logging.debug(’This message should go to the log file’)logging.info(’So shoul this’)logging.warning(’And this, too’)參數解釋

filename日志文件路徑

filemode記錄日志文件的模式,w為每次啟動程序都創建一個全新的文件記錄, a表示追加到文件末尾, 默認為a

level記錄日志的等級

format日志輸出的格式

datefmt日志輸出時間的格式

使用配置文件配置日志

[loggers]# 配置日志對象名, 默認為rootkeys=root, poj[handlers]# 日志配置名對象名keys=writeFileHandlers[formatters]# 日志輸出格式對象名keys=writeFileFormatters[logger_root]level=DEBUGhandlers=writeFileHandlers[logger_poj]level=DEBUGhandlers=writeFileHandlersqualname=writeFileFormatterspropagate=0[logger_leetcode]level=DEBUGhandlers=writeFileHandlersqualname=writeFileFormatterspropagate=0[handler_writeFileHandlers]# 設置writeFileHandlers對象的配置class=FileHandlerlevel=DEBUGformatter=writeFileFormatters# 記錄在文件中,以追加的形式args=('demo.log', 'a')[formatter_writeFileFormatters]設置writeFileHandlers對象的輸出配置format=%(asctime)s - %(name)s - %(levelname)s - %(message)sdatefmt=%Y-%d-%m %H:%M:%S使用配置文件

import logging.config# 加載配置文件logging.config.fileConfig(’logging.conf’)# 獲取日志對象名為poj的logger = logging.getLogger('poj')logger.debug(’This message should go to the log file’)logger.info(’So shoul this’)logger.warning(’And this, too’)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 搬运设备、起重设备、吊装设备—『龙海起重成套设备』 | 广州昊至泉水上乐园设备有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 移动机器人产业联盟官网| 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 一航网络-软件测评官网| 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 |