Python学习笔记14:多线程
Python支持多线程,并且标准库和第三方库有很多组件都提供对多线程的支持。
这里仅介绍最简单的标准库实现。
Threading
Python3提供一个标准库threading对多线程提供支持。
我们先看一个简单的例子:
import time
def doSomething():
time.sleep(5)
doSomething()
print("end")
这里我们假设有一个函数doSomething
需要执行一个较长时间的任务,我们用sleep
挂起线程来进行模拟。
运行这个程序后需要等5秒钟才能看到end
输出。
如果这里我们的主程序不需要等待doSomething
处理完毕再继续执行,而是可以把它放在后台执行,那我们就可以用多线程来改善这段代码:
from threading import Thread
import time
def doSomething():
time.sleep(5)
thread = Thread(target=doSomething)
thread.start()
print("end")
这里使用Thread
构建了一个线程对象,可以通过参数指定这个线程承载的函数,当然也可以传递参数等。start
方法用于启动这个线程,调用后将会在后台执行这个新线程。
我们可以看到end
会瞬间输出,但如果你细心地话会发现,此时光标依然没有结束的样子,这是在等待后台的线程运行结束。
通过上边的简单例子,我们可以看到实现多线程并不困难,事实也是如此。比如
Js
中的ajax
调用也都是通过多线程实现。多线程中真正困难的是资源锁和线程同步,涉及到多个线程协同工作的程序会显得格外复杂,无论是开发还是调试。
我们现在来用刚学到的简单的多线程知识来改善我们的web应用。
实际应用
我们的web应用中有个在用户查询时候写入日志的操作:
def writeLog(logInfo: dict) -> None:
with MyDB2() as cursor:
time.sleep(5)
_SQL = '''INSERT INTO LOG (phrase,letters,ip,browser_string,results)
VALUES (%s,%s,%s,%s,%s)'''
params = (logInfo['formData']['phrase'], logInfo['formData']
['letters'], logInfo['userIp'], logInfo['userAgent'], logInfo['results'])
cursor.execute(_SQL, params)
要知道这部分动作完全和后续的给用户显示查询结果是没有关系的,所以完全可以用多线程来改进,在改进之前我们先用sleep
来认为加入延迟,以观察前后的改进效果:
thread = Thread(target=writeLog, args=(logInfo,))
thread.start()
我们改为这样调用writeLog
,可以看到改为多线程写日志后用户操作后并不会感觉到延迟。
老规矩,最后附上工程文件:
链接:https://pan.baidu.com/s/1SrxvJ0PKa0Hy8mMX95LfUg
提取码:oxgx
复制这段内容后打开百度网盘手机App,操作更方便哦
好了,这里就简单地介绍了一下Python的多线程,如果想学习更多请查看官方文档或其它资料。