python笔记 线程参数结合日志使用

55 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

0 环境

  • 编辑器:webstorm或者vscode
  • 系统版本:windows10
  • 编辑器版本:最新
  • 浏览器:谷歌

1 传参方式

threading.Thread里的args,和函数里的args是一个意思,既然args可用,kwargs也是可用的,如下图的组合: 导入两个标准库(threading和logging),定义了一个sun函数,并且入参为a和b,执行的是:打印日志错误信息。threading.Thread调用该函数很简单,主要关注args和kwargs单独使用,以及它俩的混合使用。args或kwargs单独使用,args要保证是元组类型,kwargs保证是一个字典,当它俩一起配合使用的使用,注意了,传递位置参数和传递关键字参数的规范和函数差不多,但是有一点遗漏别遗漏:当你args传入一个值的时候,后面千万要加逗号,不然它就不是一个元组了,直接会报错。

import threading
import logging

def sum(a, b):
    logging.error(f"hello world,{a + b} \n")


threading.Thread(target=sum, args=(11, 12)).start()
threading.Thread(target=sum, args=(21,), kwargs={'b': 22}).start()
threading.Thread(target=sum, kwargs={'a': 32, 'b': 42}).start()

image.png

现在我换个写法,logging信息,存在指定的路径中,需要在logging.basicConfig中配置一下filename

import threading
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(process)s %(thread)s %(name)s %(message)s',
                    datefmt='%Y年%m月%d日  %H:%M:%S',
                    filename= './logs/log.log')

def sum(a, b):
    logging.error(f"hello world,{a + b} \n")


threading.Thread(target=sum, args=(11, 12)).start()
threading.Thread(target=sum, args=(21,), kwargs={'b': 22}).start()
threading.Thread(target=sum, kwargs={'a': 32, 'b': 42}).start()

image.png

然后我们到log目录里找,是不是有这么个log.log的文件,点开看下,有么有内容,以及是不是我们控制台打印的内容,对比一下确实对的,而且你会发现日志打印顺序没有出现乱序的问题,说明多线程下输出日志,也是没有问题,完全可以替代。 image.png

2 总结

这里主要注意,threading.Thread里的target的目标函数,假如有传参的情况,args需要是个元组,尤其当你传入一个值的时候,很容易忘记加个逗号。还有就是日志在线程中使用也是安全的。