当前位置: 首页 > news >正文

Python并发编程:threading模块详解

Python的threading模块提供了一个高级的、基于线程的并发接口。线程是操作系统能够进行运算调度的最小单位。它被包含在每个进程中,是进程中的实际运作单位。Python的threading模块让你能够创建多个线程,从而在同一时间内执行多个操作。

threading模块的主要特点

  • 线程管理:可以轻松创建和管理线程。
  • 同步机制:提供锁(Locks)、事件(Events)、条件变量(Condition)等同步原语。
  • 线程池:通过ThreadPoolExecutor类实现线程池,方便执行并发任务。

常用threading函数及其参数

Thread()

创建一个线程对象。

  • group: 线程组(通常为None)。
  • target: 线程启动时调用的函数。
  • name: 线程的名称(默认情况下是Thread-N)。
  • args: 传递给target函数的参数。
  • kwargs: 以关键字形式传递给target函数的参数。

Lock()

创建一个锁对象。

  • locked: 初始锁定状态(默认为False)。

Event()

创建一个事件对象。

  • event: 初始状态(默认为False)。

Condition()

创建一个条件变量对象。

  • lock: 关联的锁对象。

Semaphore()

创建一个信号量对象。

  • value: 信号量的初始值。

BoundedSemaphore()

创建一个有界信号量对象。

  • value: 信号量的初始值。

Thread.start()

启动线程。

  • 无参数。

Thread.join()

等待线程终止。

  • timeout: 等待时间(可选)。

Lock.acquire()

获取锁。

  • blocking: 是否阻塞(默认为True)。
  • timeout: 超时时间(默认为None)。

Lock.release()

释放锁。

示例

以下是一个使用threading模块创建线程的示例:
假设我们有一个简单的银行账户类,我们需要确保在多线程环境下对账户余额的访问是线程安全的。

import threading
import time
import random# 银行账户类
class BankAccount:def __init__(self, balance=0):self.balance = balanceself.lock = threading.Lock()def deposit(self, amount):with self.lock:new_balance = self.balance + amounttime.sleep(random.random())  # 模拟处理时间self.balance = new_balanceprint(f"Deposited {amount}. New balance is {self.balance}.")def withdraw(self, amount):with self.lock:if self.balance >= amount:new_balance = self.balance - amounttime.sleep(random.random())  # 模拟处理时间self.balance = new_balanceprint(f"Withdrew {amount}. New balance is {self.balance}.")else:print("Insufficient funds.")# 创建银行账户
account = BankAccount(1000)# 定义存款和取款的操作
def deposit_to_account(amount):account.deposit(amount)def withdraw_from_account(amount):account.withdraw(amount)# 创建线程列表
threads = []# 创建并启动存款线程
for i in range(5):thread = threading.Thread(target=deposit_to_account, args=(200,))threads.append(thread)thread.start()# 创建并启动取款线程
for i in range(5):thread = threading.Thread(target=withdraw_from_account, args=(100,))threads.append(thread)thread.start()# 等待所有线程完成
for thread in threads:thread.join()print("All transactions are complete.")

在这个示例中,我们定义了一个BankAccount类,它有一个deposit方法和一个withdraw方法,用于存款和取款。这两个方法都使用了threading.Lock来确保在多线程环境下对账户余额的修改是安全的。

我们创建了两个操作:deposit_to_account和withdraw_from_account,它们分别调用BankAccount的deposit和withdraw方法。然后,我们创建了多个线程来执行存款和取款操作。每个线程都启动后,我们使用join方法等待所有线程完成。

这个示例展示了如何在多线程环境中使用锁来同步对共享资源的访问,确保了操作的原子性和线程安全。


http://www.mrgr.cn/news/56915.html

相关文章:

  • 我开源了Go语言连接数据库和一键生成结构体的包【实用】
  • 查看Chrome安装路
  • 天润融通知识库赋能一线客户运营,不是宝妈也可以成为育儿专家
  • 计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了
  • 低秩矩阵恢复
  • KCD81PJE1T92 SSD:企业级存储解决方案的卓越选择
  • Bench4Merge:一个提升自动驾驶车辆在复杂交通场景中并车能力的综合性评估平台。
  • 1.2 C++内存
  • 证明非平方整数阶射影平面关联矩阵的主对角线有t+1个1
  • k8s_Pod健康检查
  • Python Pandas 安装指南:快速入门与验证
  • 论文开题前的必备指南:如何做好充分准备
  • LeetCode题练习与总结:重新安排行程--332
  • 【c++丨STL】string类的使用
  • HarmonyOS鸿蒙分布式文件操作的时候权限问题
  • iOS 18.1新功能抢先看:控制中心大变身,睡眠呼吸暂停监测来袭
  • 经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】
  • 多尺度建模:从理论到实践的深入探讨
  • 高客单价产品,Facebook广告投放应该怎么做?
  • Java手动实现完整的加密通信流程