- loguru可方便打印python程序运行中输出的日志,也可把日志保存在其他地方,用法比logging简单。
- 多线程和多进程能达到一样的并行效果,多进程能利用多核cpu,多线程通过os快速切换实现在单核上并行执行。线程锁会防止不同线程间共用变量出错。
from loguru import logger
import sys
from threading import Thread, current_thread
import threading
import numpy as np
from atexit import register
import time
"""
参考: https://blog.csdn.net/bailang_zhizun/article/details/107863671
loguru 日志级别: NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
"""
lock = threading.Lock()
def main():
logger.add(sys.stderr, format="{time}{level}{message}", filter="my_module", level="WARNING")
"""
Handler 为控制台输出
format 指定 输出格式
"""
for i in range(10):
if i == 0:
logger.debug("{}是0".format(i))
elif i % 2 == 0:
logger.warning("{} 是2的整倍数.".format(i))
else:
if i % 3 == 0:
logger.info("{} 是3的倍数.".format(i))
else:
logger.error("{}不是3的倍数.".format(i))
logger.critical("running ended!")
def multiThreadAdd(num, c):
with lock:
myname = current_thread().name
for i in range(c):
num += num
logger.info("线程{}-第{}次加和为{}".format(myname, i, num))
time.sleep(0.5)
def multiThreadTest(N, M):
myname = current_thread().name
logger.info("Startted {}", myname)
matrix_list = []
for i in range(M):
matrix = np.ones([N, N])
matrix_list.append(matrix)
logger.info("线程{}-第{}次加入matrix_list.".format(myname, i))
@register
def _atexit():
logger.info("All Thread DONE!")
logger.info("\n===========================================================================\n")
if __name__ == "__main__":
main()
logger.remove(handler_id=None)
logger.add("runtime.log")
logger.remove(handler_id=None)
logger.add("runtime_{time}.log")
logger.add("runtime_{time}.log", rotation="500 MB")
logger.add("runtime_{time}.log", rotation="12:00")
logger.add("runtime_{time}.log", rotation="1 week")
logger.add("runtime_{time}.log", retention="10 days")
logger.add("runtime_{time}.log", compression="zip")
logger.remove(handler_id=None)
logger.add("./Log_files/runtime_{time}.log")
@logger.catch
def my_function(x, y, z):
return 1 / (x + y + z)
my_function(0, 0, 0)
logger.remove(handler_id=None)
logger.add("Log_files/runtime_{time}.log")
def my_function1(x, y, z):
try:
return 1 / (x + y + z)
except ZeroDivisionError:
logger.exception("What?!")
my_function1(0, 0, 0)
logger.remove(handler_id=None)
logger.add("./Log_files/multiThreadAdd.log")
t1 = Thread(target=multiThreadAdd, args=(10, 15,))
t2 = Thread(target=multiThreadAdd, args=(20, 15,))
t3 = Thread(target=multiThreadAdd, args=(15, 15,))
t4 = Thread(target=multiThreadAdd, args=(12, 15,))
T = [t1, t2, t3, t4]
for t in T:
t.start()
for t in T:
t.join()