当前位置:   article > 正文

Python并发编程(1)多线程

Python并发编程(1)多线程

系统知识
cpu时间片(抽象概念)
• 对于单核cpu同一时刻只能有一个任务运行。

  1. 并发:交替执行(某时间段内的处理能力)
  2. 并行:同时执行
    在这里插入图片描述

线程:

线程是操作系统最小的调度单位, 是一串指令的集合

进程:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位

进程与线程:

• 真正在cpu上运行的是线程
• 线程共享内存空间;进程的内存是独立的
• 一个线程只能属于一个进程,而一个进程可以有多个线程,
但至少有一个线程
• 资源分配给进程,同一进程的所有线程共享该进程的所有资
源。进程的资源是独立的
• 同一个进程的线程之间可以直接交流;两个进程想通信,必
须通过一个中间代理来实现
在这里插入图片描述

Python 中用于实现多线程编程的内置模块threading:

■ 功能
• threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。
■ threading模块提供的常用类:
• Thread:创建线程
• Lock/RLock:互斥锁
*
Thread构造方法*:
• 构造方法: Thread(group=None, target=None, name=None, args=(), kwargs={})
• group: 线程组,目前还没有实现,库引用中提示必须是None;
• target: 要执行的方法;
• name: 线程名;
• args/kwargs: 要传入方法的参数

Thread实例方法
• t.name:获取或设置线程的名称
• t.getName()/setName(name): 获取/设置线程名。
• t.is_alive()、t.isAlive():判断线程是否为激活状态。返回线程是否在运行。正在运行指启动后、终
止前。
• t.ident :获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才
有效,否则它只返回None
• t.run() :线程被cpu调度后自动执行线程对象的run方法
• t.start(): 线程准备就绪,等待CPU调度,start会自动调用t.run()

threading——Thread
■ Thread实例方法
• t.join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout
(可选参数)。
• t.setDaemon(bool): 设置是后台线程(默认前台线程(False))。(在start之前设置)
• 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论
成功与否,主线程和后台线程均停止
• 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程
也执行完成后,程序停止
• t.isDaemon:判断是否为后台线程

例题:

假设有一个列表 numbers 包含了 1000 个整数,你需要编写一个程序来计算列表中所有整数的平方和。请使用多线程的方式来加快计算速度。

提示:

将列表 numbers 分成 n 个子列表,每个子列表包含大致相等数量的整数。
创建 n 个线程,每个线程负责计算一个子列表中整数的平方和。
主线程等待所有子线程执行完成,并将每个子线程计算得到的平方和累加起来。
最终结果即为平方和,通过将各个子线程计算得到的平方和相加得到。
下面是示例答案的代码:


import threading

def calculate_square_sum(numbers):
    """计算子列表中整数的平方和"""
    return sum(x*x for x in numbers)

if __name__ == "__main__":
    numbers = [i for i in range(1, 1001)]  # 包含了 1000 个整数的列表

    num_threads = 4  # 要创建的线程数量

    chunk_size = len(numbers) // num_threads
    chunks = [numbers[i:i+chunk_size] for i in range(0, len(numbers), chunk_size)]

    threads = []  # 存储线程对象的列表
    results = []  # 存储子线程计算结果的列表

    # 创建子线程并启动
    for chunk in chunks:
        thread = threading.Thread(target=lambda x: results.append(calculate_square_sum(x)), args=(chunk,))
        threads.append(thread)
        thread.start()

    # 等待所有线程执行完成
    for thread in threads:
        thread.join()

    # 计算总和
    total_sum = sum(results)

    # 打印结果
    print("平方和:", total_sum)
在这段代码中,我们首先将包含了 1000 个整数的列表 numbers 分成了 4 个子列表(根据线程数量)。然后,我们创建了 4 个子线程,每个子线程负责计算一个子列表中整数的平方和,并将计算结果存入 results 列表。最后,我们等待所有子线程执行完成,并对 results 列表中的结果进行求和。

请注意,这里的示例中将列表均分为子列表,但在实际应用中,你可能需要根据具体情况进行更合理的划分子列表的方式。

运行这段代码后,你会看到输出的平方和。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号