“开启掘金成长之旅!这是我参与「掘金日新计划 · 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()
现在我换个写法,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()
然后我们到log目录里找,是不是有这么个log.log的文件,点开看下,有么有内容,以及是不是我们控制台打印的内容,对比一下确实对的,而且你会发现日志打印顺序没有出现乱序的问题,说明多线程下输出日志,也是没有问题,完全可以替代。
2 总结
这里主要注意,threading.Thread里的target的目标函数,假如有传参的情况,args需要是个元组,尤其当你传入一个值的时候,很容易忘记加个逗号。还有就是日志在线程中使用也是安全的。