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

Python学习计划——9.1多线程编程

并发编程是一种在同一时间段内运行多个任务的方法,可以提高程序的效率和性能。Python中的多线程编程可以使用threading模块实现。以下是多线程编程的详细讲解和可运行的Python案例。

1. 什么是多线程

多线程是一种并发编程的方式,它允许在同一个进程中运行多个线程,每个线程执行不同的任务。线程是轻量级的进程,它们共享相同的内存空间,因此切换上下文的开销较小。

2. 创建线程

在Python中,可以使用threading.Thread类来创建和管理线程。创建线程的基本步骤如下:

  1. 创建一个继承自threading.Thread的类,并重写其run方法。
  2. 实例化该类并调用start方法启动线程。
示例
import threading
import timeclass MyThread(threading.Thread):def __init__(self, name):threading.Thread.__init__(self)self.name = namedef run(self):print(f"线程 {self.name} 开始")time.sleep(2)print(f"线程 {self.name} 结束")# 创建并启动线程
thread1 = MyThread("Thread-1")
thread2 = MyThread("Thread-2")thread1.start()
thread2.start()thread1.join()
thread2.join()print("主线程结束")
3. 使用线程池

使用concurrent.futures模块中的ThreadPoolExecutor可以方便地管理多个线程。它提供了一个高级接口,用于创建和管理线程池。

示例
from concurrent.futures import ThreadPoolExecutor
import timedef task(name):print(f"任务 {name} 开始")time.sleep(2)print(f"任务 {name} 结束")# 创建线程池
with ThreadPoolExecutor(max_workers=3) as executor:executor.submit(task, "Task-1")executor.submit(task, "Task-2")executor.submit(task, "Task-3")print("主线程结束")
4. 线程同步

线程共享同一内存空间,因此可能会出现多个线程同时访问和修改共享资源的问题。为了解决这个问题,可以使用线程同步机制,如锁(Lock)。

示例
import threading# 共享资源
counter = 0
lock = threading.Lock()def increment_counter():global counterwith lock:for _ in range(100000):counter += 1# 创建并启动线程
thread1 = threading.Thread(target=increment_counter)
thread2 = threading.Thread(target=increment_counter)thread1.start()
thread2.start()thread1.join()
thread2.join()print(f"最终计数值: {counter}")
5. 线程通信

线程之间可以通过队列(Queue)进行通信。queue.Queue类是一个线程安全的队列实现,可以用于在线程之间传递数据。

示例
import threading
import queue
import timedef producer(q):for i in range(5):print(f"生产者生产数据: {i}")q.put(i)time.sleep(1)def consumer(q):while True:item = q.get()if item is None:breakprint(f"消费者消费数据: {item}")time.sleep(2)# 创建队列
q = queue.Queue()# 创建并启动线程
producer_thread = threading.Thread(target=producer, args=(q,))
consumer_thread = threading.Thread(target=consumer, args=(q,))producer_thread.start()
consumer_thread.start()producer_thread.join()# 向队列发送结束信号
q.put(None)
consumer_thread.join()print("主线程结束")
6. 可运行的Python案例

下面是一个完整的Python程序,演示了多线程编程的基本操作,包括创建线程、使用线程池、线程同步和线程通信。

import threading
import time
from concurrent.futures import ThreadPoolExecutor
import queue# 示例1:创建线程
class MyThread(threading.Thread):def __init__(self, name):threading.Thread.__init__(self)self.name = namedef run(self):print(f"线程 {self.name} 开始")time.sleep(2)print(f"线程 {self.name} 结束")thread1 = MyThread("Thread-1")
thread2 = MyThread("Thread-2")thread1.start()
thread2.start()thread1.join()
thread2.join()print("主线程结束")# 示例2:使用线程池
def task(name):print(f"任务 {name} 开始")time.sleep(2)print(f"任务 {name} 结束")with ThreadPoolExecutor(max_workers=3) as executor:executor.submit(task, "Task-1")executor.submit(task, "Task-2")executor.submit(task, "Task-3")print("主线程结束")# 示例3:线程同步
counter = 0
lock = threading.Lock()def increment_counter():global counterwith lock:for _ in range(100000):counter += 1thread1 = threading.Thread(target=increment_counter)
thread2 = threading.Thread(target=increment_counter)thread1.start()
thread2.start()thread1.join()
thread2.join()print(f"最终计数值: {counter}")# 示例4:线程通信
def producer(q):for i in range 5):print(f"生产者生产数据: {i}")q.put(i)time.sleep(1)def consumer(q):while True:item = q.get()if item is None:breakprint(f"消费者消费数据: {item}")time.sleep(2)q = queue.Queue()producer_thread = threading.Thread(target=producer, args=(q,))
consumer_thread = threading.Thread(target=consumer, args=(q,))producer_thread.start()
consumer_thread.start()producer_thread.join()q.put(None)
consumer_thread.join()print("主线程结束")

可以将上面的代码复制到你的IDE中运行,观察程序的输出。这个案例综合了多线程编程的基本知识,帮助你理解和掌握这些操作。继续加油,学习Python会越来越有趣和有用!

相关文章:

Python学习计划——9.1多线程编程

并发编程是一种在同一时间段内运行多个任务的方法,可以提高程序的效率和性能。Python中的多线程编程可以使用threading模块实现。以下是多线程编程的详细讲解和可运行的Python案例。 1. 什么是多线程 多线程是一种并发编程的方式,它允许在同一个进程中…...

借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡

原文作者:Chris Akker - F5 技术解决方案架构师,Steve Wagner - F5 NGINX 解决方案架构师 原文链接:借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c…...

基于python的大学学生影响力分析系统设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

upload-labs靶场(1-19关)

upload-labs靶场 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关&#xff0c;每一关都包含着不同上传方式。 注意&#xff1a;能运行<?php phpinfo();?&…...

Python面向对象浅析

目录 面向对象基本概念 一、类和对象 类和对象是面向对象骗程的两个核心概念。 在程序开发中&#xff0c;要设计一个类&#xff0c;通常需要满足一下三个要素: self详解&#xff1a; 对象&#xff08;Object&#xff09; 魔法方法&#xff1a; 类里的一些特殊方法 __in…...

JS基本语法

JS代码写在body结束标签的上面 如点击按钮调用方法&#xff1a; 在浏览器的控制台打印测试数据 console.log() <body><button type"button" onclick"easymethod()">点击我</button><script>//JS代码&#xff0c;写在body标签的…...

LSTM详解总结

LSTM&#xff08;Long Short-Term Memory&#xff09;是一种用于处理和预测时间序列数据的递归神经网络&#xff08;RNN&#xff09;的改进版本。其设计初衷是为了解决普通RNN在长序列训练中出现的梯度消失和梯度爆炸问题。以下是对LSTM的详细解释&#xff0c;包括原理、公式、…...

制品库nexus

详见&#xff1a;Sonatype Nexus Repository搭建与使用&#xff08;详细教程3.70.1&#xff09;-CSDN博客 注意事项&#xff1a; 1.java8环境使用nexus-3.69.0-02-java8-unix.tar.gz包 2.java11环境使用nexus-3.70.1-02-java11-unix.tar.gz包 3.注意使用制品库/etc/yum.repos.…...

2022.11.17 阿里钉钉数据开发岗位一面

今天晚上和阿里钉钉面试官聊了一面&#xff0c;整个过程持续45分钟&#xff0c;还是相当持久的。前面先让我自我介绍&#xff0c;包括自身背景、工作经历和项目经验&#xff0c;在介绍的时候面试官几次打断&#xff0c;让我停下来&#xff0c;然后他提问&#xff0c;我很纳闷还…...

【无标题】Git(仓库,分支,分支冲突)

Git 一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更 一&#xff0e;Git的主要功能&#xff1a; 二&#xff0e;准备git机器 修改静态ip&#xff0c;主机名 三&#xff0e;git仓库的建立&#xff1a; 1.安装git [rootgit ~]# yum -y install git 2.创建一个…...

访问控制列表(ACL)

文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List&#xff0c;访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…...

自用git命令(待完善)

----------------------------------------------------------------------------------------- ###基础 git config --global user.name "xxxxx" #设置提交人 name git config --global user.email "xxxxxx163.com" #设置提交人 email git …...

突破•指针四

听说这是目录哦 函数指针数组&#x1fae7;用途&#xff1a;转移表 回调函数&#x1fae7;能量站&#x1f61a; 函数指针数组&#x1fae7; 函数指针数组是存放函数地址的数组&#xff0c;例如int (*parr[5])()中parr先和[]结合&#xff0c;说明parr是可以存放5个函数地址【元…...

深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!

&#x1f538; 第一部分&#xff1a;requests库的入口 我们从requests库的入口开始&#xff0c;通常我们会使用 requests.get() 或 requests.post() 等方法发送HTTP请求。那么&#xff0c;这些方法背后究竟做了些什么呢&#xff1f;我们从requests.get()方法开始看起&#xff…...

day1 服务端与消息编码

文章目录 消息的序列化与反序列化通信过程服务端的实现main 函数(一个简易的客户端) 本文代码地址&#xff1a; 本文是7天用Go从零实现RPC框架GeeRPC的第一篇。 使用 encoding/gob 实现消息的编解码(序列化与反序列化)实现一个简易的服务端&#xff0c;仅接受消息&#xff0c…...

部署WMS仓储管理系统项目后的注意事项

在探讨现代WMS仓储管理系统的部署与运营时&#xff0c;我们不得不深入剖析其背后的多维度考量与策略&#xff0c;以确保这一核心系统能够无缝融入并推动企业的整体供应链优化。WMS仓储管理系统作为连接仓库内部操作与外部供应链的桥梁&#xff0c;其重要性不言而喻&#xff0c;…...

跨网段 IP 地址通信故障分析

现如今计算机网络的规模和复杂性不断增加&#xff0c;跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障&#xff0c;严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…...

存储引擎MySQL和InnoDB(数据库管理与高可用)

1、存储引擎 存储引擎是核心组成部分&#xff0c; 是构成数据库最基础最底层的部件&#xff0c; 利用这个部件&#xff0c;你的Mysql能够对数据进行查询、创建、更新、删除等操作&#xff0c; 也就是说&#xff0c;用户所输入的一系列的mysql语句&#xff0c;是由存储引擎来…...

探索局域网传输新境界 | 闪电藤 v2.2.7

在这个数字化时代&#xff0c;文件的快速、安全传输是我们日常工作中不可或缺的一部分。今天&#xff0c;电脑天空向大家介绍一款革命性的局域网文件传输工具——闪电藤&#xff0c;它将彻底改变你的文件传输体验。 &#x1f3a8; 界面设计 —— 极简之美 闪电藤采用极简的设…...

Tiling Window Management

我主要说一下windows版的 下面这个链接用的人比较多 GitHub - LGUG2Z/komorebi: A tiling window manager for Windows &#x1f349; 建议搭配 GitHub - da-rth/yasb: A highly configurable cross-platform (Windows) status bar written in Python. GitHub - amnweb/ya…...

【参数辨识】经典Prandtl–Ishlinskii(PI)迟滞模型及其PSO算法参数辨识【含Matlab源码 15544期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…...

机智云物联网边缘管理系统通过国产化硬件适配认证:实战解析边缘计算架构与生态价值

1. 项目概述&#xff1a;从“云端”到“边缘”&#xff0c;一次关键的认证意味着什么&#xff1f;最近&#xff0c;我们团队主导的“机智云物联网边缘管理系统”成功通过了某主流国产化硬件平台的适配认证。这个消息在内部技术群里传开时&#xff0c;很多同事的第一反应是&…...

5分钟掌握AML模组管理器:XCOM 2模组管理终极指南

5分钟掌握AML模组管理器&#xff1a;XCOM 2模组管理终极指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xco…...

2026学数据分析对产品岗位的价值分析

一、数据分析在产品岗位中的核心价值数据分析能力帮助产品经理更精准地理解用户需求&#xff0c;优化产品决策。通过数据驱动的方法&#xff0c;减少主观臆断&#xff0c;提升产品迭代效率。数据可视化工具&#xff08;如Tableau、Power BI&#xff09;和统计分析能力&#xff…...

Unity科幻隧道系统:模块化语法与三层材质架构

1. 这不是“贴图模型”的资源包&#xff0c;而是一套可复用的科幻空间语法系统你有没有试过在Unity里搭一个像《银翼杀手2049》里那种泛着冷光、布满管线与全息界面的通道&#xff1f;我去年做一款赛博朋克风格的VR导览项目时&#xff0c;就卡在这一步——买了三套号称“科幻隧…...

5分钟搞定专业照片水印:Semi-Utils让你的摄影作品瞬间升级

5分钟搞定专业照片水印&#xff1a;Semi-Utils让你的摄影作品瞬间升级 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为照片添加水印而烦恼吗…...

如何快速解决Cursor试用限制:终极完整指南

如何快速解决Cursor试用限制&#xff1a;终极完整指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial request limit. / Too many …...

免ROOT使用Frida:Android合规调试的底层原理与四条落地路径

1. 这不是“越狱式”调试&#xff0c;而是一条被低估的合规路径 很多人一听到 Frida&#xff0c;第一反应就是“得先 root 手机”“得 patch apk”“得重打包签名”——仿佛不撬开系统大门&#xff0c;就进不了应用内存。我最初也这么想&#xff0c;直到在某次金融类 App 的灰…...

3个关键技术方案:如何系统化解决Navicat Premium试用期限制

3个关键技术方案&#xff1a;如何系统化解决Navicat Premium试用期限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 本文旨…...

AI不可靠性工程指南:从失效机理到五层防护网

1. 这不是一句抱怨&#xff0c;而是一条必须写进操作手册的警告 “AI Is Unreliable”——当我在第三个项目里连续两次被同一个大模型生成的Python函数在边界条件下 silently 返回 None 而不是抛出异常、导致下游数据管道静默丢失23%的样本后&#xff0c;我把这句话钉在了团队共…...