• 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/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    bzoj3816 矩阵变换
    bzoj5029 贴小广告
    【BZOJ-1208】宠物收养所 Splay
    【BZOJ-2879】美食节 最小费用最大流 + 动态建图
    【BZOJ-1984】月下“毛景树” 树链剖分
    写在SDOI2016Round1前的To Do List
    BZOJ solve 100 纪念
    BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)
    【SDOI2009】解题汇总
    BZOJ-1879 Bill的挑战 状态压缩DP
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14584162.html
Copyright © 2020-2023  润新知