zoukankan      html  css  js  c++  java
  • 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/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    洛谷P3400 仓鼠窝(单调栈)
    牛客练习赛65
    2015 HIAST Collegiate Programming Contest] 题解(AK)
    “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)
    POJ 2421 Constructing Roads
    逆序数&&线段树
    HDU-1166 敌兵布阵 (线段树&&树状数组入门)
    Codeforces Round #484 (Div. 2)
    HDU
    HDU 5773 The All-purpose Zero (变形LIS)
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14584162.html
Copyright © 2011-2022 走看看