Python学习笔记14:多线程

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的多线程,如果想学习更多请查看官方文档或其它资料。

本篇文章首发自魔芋红茶的博客https://www.cnblogs.com/Moon-Face/ 请尊重其他人的劳动成功,转载请注明。
原文地址:https://www.cnblogs.com/Moon-Face/p/14584162.html