python测试开发基础---线程和进程的概念

devtools/2024/9/20 9:19:27/ 标签: python, 数据库

多线程和多进程

多线程和多进程是实现并发的两种主要方法,它们各有特点和适用场景。下面详细讲解它们的区别:

1. 基本定义

  • 多线程(Multithreading)

    • 在一个单一进程内创建多个线程,每个线程都可以独立执行任务。所有线程共享进程的内存和资源。

  • 多进程(Multiprocessing)

    • 创建多个独立的进程,每个进程有自己的内存空间和资源。进程之间相互独立,不共享内存。

2. 内存管理

  • 多线程

    • 所有线程共享同一进程的内存空间,包括数据和代码。这使得线程间的数据共享比较容易,但也带来了线程安全的问题。例如,多个线程同时修改共享数据时,可能会发生竞态条件或数据损坏。

  • 多进程

    • 每个进程拥有独立的内存空间,进程之间的数据不共享。进程间的通信(IPC,Inter-Process Communication)需要通过专门的机制,如管道、消息队列或共享内存。进程之间的隔离性较强,不会因为一个进程的崩溃而影响其他进程。

3. 开销和性能

  • 多线程

    • 创建和管理线程的开销较小,因为线程共享同一进程的资源。

    • 线程之间的上下文切换开销较小,但需要额外的同步机制(如锁)来确保线程安全。

  • 多进程

    • 创建和管理进程的开销较大,因为每个进程都有独立的内存空间和资源。

    • 进程间的上下文切换开销较大,但进程之间不需要同步机制,因为进程是隔离的。

4. 并发性

  • 多线程

    • 适合在同一进程中并发执行多个任务,这些任务通常需要频繁地共享数据。例如,网络服务器处理多个请求时,使用线程可以高效地管理并发任务。

    • 在 CPU 密集型任务中,由于全局解释器锁(GIL)的存在(在 Python 中),多线程的并发性能可能受到限制。

  • 多进程

    • 适合处理 CPU 密集型任务,因为每个进程可以独立运行在不同的 CPU 核心上,从而实现真正的并行处理。

    • 进程的创建和销毁较慢,但适合需要高度隔离和独立性任务的场景。

5. 错误处理

  • 多线程

    • 如果一个线程崩溃,可能会导致整个进程崩溃,因为线程共享同一进程的资源和内存。

  • 多进程

    • 如果一个进程崩溃,其他进程不会受到直接影响,因为进程是相互隔离的。

6. 适用场景

  • 多线程

    • 适用于 I/O 密集型任务,如网络请求、文件读写等,需要频繁进行 I/O 操作的场景。

    • 在 Python 中,由于 GIL 的限制,多线程在 CPU 密集型任务中的效果可能不如多进程。

  • 多进程

    • 适用于 CPU 密集型任务,如数据处理、计算密集型操作等,可以充分利用多核 CPU 的计算能力。

    • 适合需要进程隔离、资源独立的任务,如处理不同的服务或任务。

示例代码

多线程示例(Python):

import threading
import time
​
def worker():print('Thread starting')time.sleep(2)print('Thread ending')
​
threads = []
for _ in range(3):t = threading.Thread(target=worker)threads.append(t)t.start()
​
for t in threads:t.join()

多进程示例(Python):

import multiprocessing
import time
​
def worker():print('Process starting')time.sleep(2)print('Process ending')
​
processes = []
for _ in range(3):p = multiprocessing.Process(target=worker)processes.append(p)p.start()
​
for p in processes:p.join()

总结

  • 多线程:适合 I/O 密集型任务,线程共享内存和资源,开销较小,但需要注意线程安全。

  • 多进程:适合 CPU 密集型任务,进程间隔离性强,适合需要独立运行和较高容错性的场景,但创建和管理进程的开销较大。

在 Python 中,线程(thread)是用于并发执行代码的轻量级执行单元。Python 的线程支持由 threading 模块提供。线程使得程序能够同时运行多个任务,提高了程序的执行效率,特别是在处理 I/O 密集型操作时。以下是一些关于 Python 线程的基本概念和使用示例:

基本概念

  1. 线程创建:

    • 你可以通过继承 threading.Thread 类并重写其 run 方法来创建线程。

    • 也可以通过传递一个可调用对象(如函数)给 Thread 类的构造函数来创建线程。

  2. 线程同步:

    • 由于多个线程可以同时访问共享资源,需要使用线程同步机制(如锁)来避免数据竞争和不一致性。

    • threading.Lockthreading.RLockthreading.Condition 是常用的同步工具。

  3. 全局解释器锁 (GIL):

    • Python 的 CPython 实现使用 GIL,这意味着即使在多线程环境下,任何时刻只有一个线程在执行 Python 字节码。因此,多线程对 CPU 密集型操作的提升有限,但对 I/O 密集型操作有帮助。

示例代码

基本线程创建与使用
import threading
import time
​
def worker():"""线程执行的函数"""print(f"线程 {threading.current_thread().name} 正在工作")time.sleep(2)print(f"线程 {threading.current_thread().name} 工作完成")
​
# 创建线程
thread1 = threading.Thread(target=worker, name="Worker1")
thread2 = threading.Thread(target=worker, name="Worker2")
​
# 启动线程
thread1.start()
thread2.start()
​
# 等待线程结束
thread1.join()
thread2.join()
​
print("所有线程完成")
线程同步
import threading
​
# 创建一个锁对象
lock = threading.Lock()
​
def thread_safe_function():"""线程安全的函数"""with lock:print(f"线程 {threading.current_thread().name} 正在访问共享资源")# 模拟对共享资源的访问time.sleep(1)print(f"线程 {threading.current_thread().name} 完成对共享资源的访问")
​
# 创建多个线程
threads = []
for i in range(5):t = threading.Thread(target=thread_safe_function, name=f"Thread-{i}")t.start()threads.append(t)
​
# 等待所有线程完成
for t in threads:t.join()
​
print("所有线程完成")

常用线程工具

  • threading.Event: 用于线程间的事件通知。

  • threading.Condition: 用于在特定条件下让线程等待或通知其他线程。

  • threading.Semaphore: 控制同时访问某个资源的线程数量。

线程的使用要根据具体情况权衡性能和复杂度,尤其在涉及共享数据和资源时,需要谨慎处理同步问题。


http://www.ppmy.cn/devtools/109001.html

相关文章

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程: 2、idea创建Maven JavaEE工程: (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目…

spring boot 项目 跟 JavaScript 简单 websocket 使用

文章目录 websocket 简绍WebSocket 的优势包括:JavaScript 设置处理事件 Java 服务端设置导jar包创建WebSocket端点EnableWebSocketregisterWebSocketHandlers 实现WebSocket处理器afterConnectionEstablishedafterConnectionClosedhandleTextMessage 注销WebSocket…

FPGA开发:Verilog基础语法

逻辑值 逻辑0:逻辑低电平,条件为假;逻辑1:逻辑高电平,条件为真;逻辑 X:未知逻辑电平,可能是高电平,也可能是低电平;逻辑 Z:表示高阻态&#xff0c…

uniapp个人健康预警管理系统 微信小程序的设计与实现 38vk1

目录 博主介绍技术栈系统设计🌟文末获取源码数据库🌟具体实现截图后端前端java类核心代码部分展示可行性论证个人心得系统测试操作可行性源码获取详细视频演示 博主介绍 👇🏻 博主介绍:👇🏻 专…

matplotlib中文乱码问题

在使用Matplotlib进行数据可视化的过程中,经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的,而matplotlib 默认使用ASCII 编码,但是当使用pyplot时,是支持unicode编码的,只是默认字体是英文字体,导…

【算法】单词出现次数和位置统计

【算法】单词出现次数和位置统计 题目描述 编写一个程序,用于统计一个给定单词在一段文本中出现的次数以及第一次出现的位置。如果单词在文本中出现,则输出出现次数和第一次出现的位置(位置从0开始计算)。如果单词没有出现&…

驱动程序 VS 裸板程序

相同点 直接操作硬件:无论是驱动程序还是裸板程序,它们都需要直接操作硬件,通过向硬件寄存器写入值或读取值来控制硬件的行为。依赖特定硬件:两者都依赖于特定的硬件平台,需要针对具体的硬件特性进行编程。 不同点 …

Notepad++ 安装部署教程

Notepad 是一款功能强大且灵活的文本编辑器,主要用于编写代码、编辑文本文件等。下面是如何在 Windows 上下载安装 Notepad 的详细教程。 下载 Notepad 访问官网下载页: 打开你的网络浏览器,访问 Notepad 的官方网站:Notepad 官网 导航到下…

【Linux】Linux 共享内存:高效的进程间通信

文章目录 Linux 共享内存:高效的进程间通信1. 什么是共享内存?2. 共享内存的实现步骤2.1 创建共享内存2.2 映射共享内存2.3 读写共享内存2.4 解除映射和删除共享内存 3. 共享内存的同步问题信号量示例: 4. 共享内存的优势与劣势优势&#xff…

电工基础知识

1、电工常用的电工工具 2、PPR常用配件名称 3、铜芯导线如何选择线鼻子 4、丝锥孔径对照表 5、三相电机接线方法_星形_角型 6、内六角螺铨尺寸表 7、常用螺母规格尺寸 8、常用螺栓螺母名称 9、灭火器分类使用 10、电缆颜色使用代码 11、电缆铜铝鼻子 12、空气开关

企业级使用docker实现负载均衡

利用Docker容器编排完成haproxy和nginx负载均衡架构实施 利用 Docker 编排实现 HAProxy 和 Nginx 负载均衡架构的介绍: 首先,使用 Docker Compose 进行容器编排。创建一个 haproxy.yml 文件,定义 HAProxy 和 Nginx 服务。HAProxy 容器作为前…

利士策分享,如何规划多彩的大学生活?

利士策分享,学习规划多彩的大学生活 踏入大学,如同开启一场充满未知与可能的旅程。 为了让这段旅程不仅充满学术的熏陶,还洋溢着生活的多彩与人际的和谐,我们需要精心规划,积极行动。 一、多彩规划:点亮大学…

基于51单片机的倒计时定时器proteus仿真

地址: https://pan.baidu.com/s/1_Ig_S0KKrba9VAjovDW71g 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectr…

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心&#xff1a;连续和&#xff08;count&#xff09;< 0时&#xff0c;放弃当前起点的连续和&#xff0c;将下一个数作为新起点&#xff0c;这…

CSS实现DIV水平展示

CSS实现DIV水平展示 css代码 .container {display: flex; /* 使用 Flexbox */justify-content: space-between; /* 在主轴上均匀排列 */width: 100%; /* 设置容器宽度 */ } .box {flex:1; height:100px; }HTML代码 <div class"container"><div class&quo…

vue多环境配置和打包

件名的后缀来指定它们仅在特定模式下被加载。 .env&#xff1a;所有环境下都会加载的通用配置。 .env.local&#xff1a;本地覆盖配置&#xff0c;不加入版本控制。 .env.[mode]&#xff1a;仅为指定的模式加载的配置文件&#xff0c;例如.env.development、.env.production、…

XSS和sql注入部分场景测试用例样例

目录 1. SQL 注入测试用例设计 基本 SQL 注入 复杂 SQL 注入 盲注测试 2. XSS 攻击测试用例设计 基本 XSS 攻击 复杂 XSS 攻击 DOM-based XSS 1. SQL 注入测试用例设计 SQL 注入攻击通常通过在输入字段中插入恶意 SQL 代码&#xff0c;试图操纵数据库查询。设计这些测试…

基于TCP的web端服务器数据库查询商品

背景描述 该系统为创建网络并发服务器&#xff0c;搭建HTML网络页面框架&#xff0c;通过HTTP超文本网络传输与用户建立连接&#xff08;TCP建立连接&#xff09;&#xff0c;从自己建立的数据库中查询用户所需信息&#xff0c;使用户能在网页中直接查询相关内容。本系统包括…

算法基础-快速排序

快速排序 i、j不相邻时&#xff0c;指向同一个下标 i、j相邻时&#xff0c;j 比 i 小 不管是否相邻&#xff0c;最后一次循环的if条件一定是 i>j 来退出循环&#xff0c;即最后一次的 if(i<j) 不执行 按照 j 来划分,x a[l r >> 1]&#xff0c;分为 [ l&#xff0…

前端***

void&#xff08;0&#xff09;的作用是什么&#xff1f; void操作符使表达式的运算结果返回 undefined。 void&#xff08;0&#xff09;用于防止页面刷新&#xff0c;并在调用时传递参数“0”。 void&#xff08;0&#xff09;用于调用另一种方法而不刷新页面。 列举几种类…