Python并发-线程和进程

news2024/10/6 0:30:17

一、线程和进程对应的问题

**1.进程:**CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
**2.线程:**IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。

二、进程

定义:进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
CPython解释器本身就不是线程安全的,因此有全局解释器锁(GIL),一次只允许使用一个线程执行Python字节码。因此,一个Python进程通常不能同时使用多个CPU核心。
在这里插入图片描述
Python中的多进程实现:
futures.ProcessPoolExecutor类。现在流行multiprocessing模块。

import multiprocessing

# 定义一个函数,用于在多个进程中执行任务
def worker_function(index):
    print(f"Worker {index} started")
    result = index * 2
    print(f"Worker {index} result: {result}")
    print(f"Worker {index} finished")

if __name__ == "__main__":
    # 创建一个进程池,可以指定要创建的进程数(这里为3)
    num_processes = 3
    pool = multiprocessing.Pool(processes=num_processes)

    # 使用进程池执行任务
    # 这里将任务分配给三个进程并行执行
    pool.map(worker_function, range(num_processes))

    # 关闭进程池,等待所有进程完成
    pool.close()
    pool.join()

    print("All workers have finished")

还有一种更简单的,使用

https://zhuanlan.zhihu.com/p/509084322

三、线程

进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
在这里插入图片描述
线程和进程都具有一砂锅五个状态。
Python中的实现:

import threading

# 定义一个函数,用于在线程中执行任务
def worker_function(thread_id):
    print(f"Thread {thread_id} started")
    # 在这里可以执行一些任务
    print(f"Thread {thread_id} finished")

if __name__ == "__main__":
    # 创建多个线程
    num_threads = 3
    threads = []

    for i in range(num_threads):
        thread = threading.Thread(target=worker_function, args=(i,))
        threads.append(thread)

    # 启动所有线程
    for thread in threads:
        thread.start()

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

    print("All threads have finished")

四、二者的区别

多进程和多线程都是用于并发编程的技术,但它们有一些共性和区别:

共性:

  1. 并发性: 无论是多进程还是多线程,它们都允许在程序中执行多个任务,并在不同的执行上下文中交替执行这些任务,从而实现并发性。

  2. 共享资源: 多进程和多线程都可以访问共享的内存资源,这允许多个任务之间进行数据交换和共享数据。

  3. 并行执行: 在多核或多 CPU 的系统上,多进程和多线程都可以实现真正的并行执行,从而提高程序的性能。

区别:

  1. 独立性:

    • 多进程:每个进程都有独立的内存空间和 Python 解释器,它们之间彼此独立,因此一个进程的错误通常不会影响其他进程。
    • 多线程:所有线程共享同一进程的内存空间,它们之间共享全局变量和数据。因此,一个线程的错误可能会影响其他线程和整个进程。
  2. 创建和销毁:

    • 多进程:创建和销毁进程通常比较慢,并且需要更多的系统资源,因为每个进程都有独立的内存空间。
    • 多线程:创建和销毁线程通常更快,因为它们共享进程的内存空间,但线程之间的管理和同步可能更复杂。
  3. 并发性和并行性:

    • 多进程:可以在多个 CPU 上并行执行,因此适用于 CPU 密集型任务。然而,多进程之间的通信开销相对较高。
    • 多线程:在单个 CPU 上的并发性较强,适用于 I/O 密集型任务,但由于 GIL 的存在,多线程不能实现真正的多核并行。
  4. 同步和锁:

    • 多进程:通常需要使用进程间通信(Inter-Process Communication,IPC)机制来实现进程之间的协作,例如管道、队列和共享内存。
    • 多线程:线程之间可以更容易地共享数据,但需要使用锁(例如互斥锁)来确保线程安全。
  5. 资源开销:

    • 多进程:通常比多线程消耗更多的内存和系统资源。
    • 多线程:相对较轻量,消耗的资源较少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1295529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java的招聘系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

嵌入式杂记 - MDK的Code, RO-data , RW-data, ZI-data意思

嵌入式杂记 - Keil的Code, RO-data , RW-data, ZI-data意思 MDK中的数据分类MCU中的内部存储分布MDK中数据类型存储Code代码段例子 RO-data 只读数据段例子 RW-data 可读写数据段例子 ZI-data 清零数据段例子 在嵌入式开发中,我们经常都会使用一些IDE,例…

2023.12.7 关于 MySQL 事务详解

目录 事务的四大特性 原子性 一致性 持久性 隔离性 事务并发执行 脏读 不可重复读 幻读 四个隔离级别 read uncommitted read committed repeatable read serializable 事务的四大特性 原子性 一个事务中的所有操作,要么全部完成,要么全部…

2.修改列名与列的数据类型

修改字段名与字段数据类型 1.修改字段名 有时,在我们建好一张表后会突然发现,哎呀!字段名貌似写错了!怎么办?要删了表再重新建一个新表吗?还是要删了这个字段再新建一个新的字段? 都不用&…

【开源】基于JAVA的校园疫情防控管理系统

项目编号: S 037 ,文末获取源码。 \color{red}{项目编号:S037,文末获取源码。} 项目编号:S037,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、…

proftpd安全加固:限制用户FTP登录

其实无所谓安全加固,因为proftp默认就是限制用户FTP登录的,这里有点凌乱得研究和实验了proftpd如何进行限制的,以及可能的放开限制。懂了这些才能更好的进行防护配置。 RootLogin指令其实主要作用就是启用ROOT访问。通常,proftpd在…

官方版小白重装系统之制作装机U盘篇

一、前言 很多人会安装电脑的操作系统,也有很多人不会安装,甚至还要花时间花金钱找人安装。 网上重装系统的网站很多,安装系统的工具软件也很多,其中不乏捆绑有病毒木马、广告间谍的,很多人深受其害,那为什…

聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化

聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化 目录 聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于谱聚类(Spectral Cluster)的聚类算法可视化(完…

论文阅读《Learning Adaptive Dense Event Stereo from the Image Domain》

论文地址:https://openaccess.thecvf.com/content/CVPR2023/html/Cho_Learning_Adaptive_Dense_Event_Stereo_From_the_Image_Domain_CVPR_2023_paper.html 概述 事件相机在低光照条件下可以稳定工作,然而,基于事件相机的立体方法在域迁移时性…

Redis KEY*模糊查询导致速度慢、阻塞其他 Redis 操作

Redis KEY*模糊查询导致交互速度慢、阻塞其他 Redis 操作 查询速度慢的原因 在Redis中,使用通配符 KEYS 命令进行键的模糊匹配(比如 KEYS key*)可能会导致性能问题,尤其是在数据集较大时。这是因为 KEYS 命令的实现需要遍历所有…

盘古信息牵手时信集团,IMS-MOM护航制造企业海外工厂高效管理

在当前全球化经济背景下,制造企业海外工厂布局的趋势日益凸显。布局全球多工厂制造基地在管理方面需要直面多方面的挑战,包含复杂的全球供应链管理、跨地域资源协同合作、远程监测运营等等。在这种背景下,数字化智能制造系统被业内广泛应用&a…

多段图问题-动态规划解法

一、多段图问题 问题描述:设图G(V, E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得对于E中的任何一条边(u, v),必有u∈Vi,v∈Vim (1≤i≤k, 1<im≤k),…

因小失大,一个普通的postman多接口顺序执行,让项目瘫痪了一天

Runner的使用 postman不仅可以单独运行某个接口,postman的 Runner模块可以运行多个接口,可以实现真正意义上的自动化接口测试 Runner的主要功能如下 按顺序调用接口,执行用例; 批量发送请求; 对接口数据进行参数化…

Termux+Hexo结合内网穿透轻松实现安卓手机搭建博客网站发布公网访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

C++STL的string模拟实现

文章目录 前言string的成员变量成员函数构造函数拷贝构造赋值重载 模拟实现string各种接口print迭代器普通迭代器const迭代器 string比较大小push_backinsert 和 eraseinserterase reserve和resizereserveresize swapfindcout和cincoutcin 前言 今天要讲string的底层实现&…

c语言实例:计算并输出一个整数数组的平均值

大家好,今天给大家介绍一个c语言实例:计算并输出一个整数数组的平均值,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 以下是一个使用C语言实现的实例&am…

SMART PLC系统时间功能块

有时需要进行和系统时间相关的一些控制应用,所以PLC的系统时间对于此时的工程应用显得尤为重要。下面我们介绍系统时间功能块,这里的功能块我们可以对系统时间进行读取,还可以对系统时间进行修改。 1、系统时间 2、修改系统时间 功能块利用指针和指针运算完成系统时间读取和…

探索鸿蒙 TextInput组件

TextInput 根据组件名字,可以得知他是一个文本输出框。 声明代码👇 TextInput({placeholder?:ResourceStr,text?:ResourceStr}); placeholder: 就是提示文本,跟网页开发中的placeholder一样的 text:输入框当前的文本内容 特殊属…

人工智能从 DeepMind 到 ChatGPT ,从 2012 - 2024

本心、输入输出、结果 文章目录 人工智能从 DeepMind 到 ChatGPT ,从 2012 - 2024前言2010年:DeepMind诞生2012~2013年:谷歌重视AI发展,“拿下”Hinton2013~2014年:谷歌收购DeepMind2013年&…

Linux常用命令——arpwatch命令

在线Linux命令查询工具 arpwatch 监听网络上ARP的记录 补充说明 arpwatch命令用来监听网络上arp的记录。 语法 arpwatch(选项)选项 -d&#xff1a;启动排错模式&#xff1b; -f<记录文件>&#xff1a;设置存储ARP记录的文件&#xff0c;预设为/var/arpwatch/arp.d…