• python 进阶系列 - 15讲 线程threading模块详解


    在这篇文章中我们将详细讨论如何在Python中使用threading模块:

    • 如何去创建并启动多个线程
    • 如何等待多个线程完成
    • 如何在多个线程中使用共享数据
    • 如何使用 Lock 来防止竞争条件
    • 什么是守护线程
    • 如何使用 Queue 进行线程安全的数据/任务处理。

    创建并启动线程

    你可以使用threading.Thread()来创建一个线程。它需要两个重要的参数:

    • target: 一个调用对象(函数),这个线程将在线程启动时被调用
    • args: 函数的参数,必须是一个元组

    看一个简单示例:通过thread.start()启动线程, 并使用thread.join()等待线程结束。

    from threading import Thread
    
    
    def square_numbers():
        for i in range(1000):
            result = i * i
    
    
    if __name__ == "__main__":
        threads = []
        num_threads = 10
        # 创建线程并为每个线程分配一个函数
        for i in range(num_threads):
            thread = Thread(target=square_numbers)
            threads.append(thread)
        # 开始所有线程
        for thread in threads:
            thread.start()
        # 等待所有线程结束
        # 主线程阻塞,直到所有线程结束
        for thread in threads:
            thread.join()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    共享数据

    因为线程在同一个内存空间中,它们可以访问同一个(公共)数据。 因此,你可以简单地使用全局变量,该变量可以被所有线程读取和写入。

    例子:创建两个线程,每个线程访问当前某个变量值, 并修改它(在这个例子中只是增加1)。 每个线程执行10次操作。

    示例代码:

    from threading import Thread
    import time
    
    # 所有线程都可以访问这个全局变量
    database_value = 0
    
    
    def increase():
        global database_value  # 全局变量
        local_copy = database_value  # 复制一份
        local_copy += 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Ruby 环境变量
    【Rust日报】2022-08-13 Rust Sitter 轻松编写快速且健壮的解析器
    高空玻璃擦洗器结构设计(lunwen+任务书+开题+文综+翻译及原文+答辩PPT+cad图纸)
    Vue学习:插槽
    基于STC89C52单片机的智能车控制系统设计
    DNS和ICMP协议
    Unity UI 框架
    如何记账 分享记账的作用
    Union类型和集合的union()方法-set.union()
    有才有料有趣,聊聊技术Demo的二三事
  • 原文地址:https://blog.csdn.net/pythontip/article/details/126802831