Python中的多进程与多线程详解

news2024/9/29 13:17:10

文章目录

  • 一、多进程(Multiprocessing)
    • 1.1 概念
    • 1.2 创建多进程的方式
    • 1.3 进程间通信(IPC)
    • 1.4 优点
    • 1.5 缺点
  • 二、多线程(Multithreading)
    • 2.1 概念
    • 2.2 创建多线程的方式
    • 2.3 线程同步机制
    • 2.4 优点
    • 2.5 缺点

一、多进程(Multiprocessing)

1.1 概念

  • 在Python中,多进程是指同时运行多个独立的进程。每个进程都有自己独立的内存空间,数据不共享(除非使用特定的进程间通信机制)。这意味着一个进程中的变量和状态不会直接影响其他进程,进程之间是相对独立的实体。

1.2 创建多进程的方式

  • 使用 multiprocessing.Process
    • 示例:
      import multiprocessing
      
      def worker():
          print('This is a worker process')
      
      if __name__ == '__main__':
          p = multiprocessing.Process(target = worker)
          p.start()
          p.join()
      
    • 这里定义了一个函数 worker,然后通过创建 Process 类的实例,将 worker 函数作为目标函数。start 方法用于启动进程,join 方法用于等待进程结束。
  • 使用进程池(Pool
    • 示例:
      import multiprocessing
      
      def square(x):
          return x * x
      
      if __name__ == '__main__':
          with multiprocessing.Pool(processes = 4) as pool:
              results = pool.map(square, [1, 2, 3, 4, 5])
              print(results)
      
    • 进程池可以方便地管理多个进程。在这个例子中,定义了一个函数 square,然后使用进程池将该函数应用到一个列表中的每个元素上。

1.3 进程间通信(IPC)

  • 队列(Queue
    • 示例:
      import multiprocessing
      
      def writer(q):
          for i in range(10):
              q.put(i)
      
      def reader(q):
          while True:
              try:
                  item = q.get()
                  print(item)
              except multiprocessing.Queue.Empty:
                  break
      
      if __name__ == '__main__':
          q = multiprocessing.Queue()
          pw = multiprocessing.Process(target = writer, args=(q,))
          pr = multiprocessing.Process(target = reader, args=(q,))
          pw.start()
          pw.join()
          pr.start()
          pr.join()
      
    • 队列是一种常见的进程间通信方式。一个进程可以将数据放入队列,另一个进程可以从队列中取出数据。
  • 管道(Pipe
    • 示例:
      import multiprocessing
      
      def f(conn):
          conn.send([42, None, 'hello'])
          conn.close()
      
      if __name__ == '__main__':
          parent_conn, child_conn = multiprocessing.Pipe()
          p = multiprocessing.Process(target = f, args=(child_conn,))
          p.start()
          print(parent_conn.recv())
          p.join()
      
    • 管道提供了一种双向通信的方式,在父进程和子进程之间建立连接来传递数据。

1.4 优点

  • 真正的并行执行:在多核CPU上,不同进程可以在不同的核心上同时运行,充分利用多核资源。
  • 进程间隔离性好:一个进程的崩溃通常不会影响其他进程,提高了系统的稳定性。

1.5 缺点

  • 资源消耗较大:每个进程都有自己独立的内存空间等资源,相比于多线程,多进程占用更多的系统资源。
  • 进程间通信相对复杂:需要使用特定的进程间通信机制,如队列、管道等,不像多线程可以直接共享数据(虽然共享数据也有同步问题)。

二、多线程(Multithreading)

2.1 概念

  • 多线程是指在一个进程内部同时运行多个线程。线程是进程中的执行单元,同一个进程中的线程共享进程的内存空间,包括代码段、数据段等。这使得线程之间可以方便地共享数据,但也带来了数据同步的问题。

2.2 创建多线程的方式

  • 使用 threading.Thread
    • 示例:
      import threading
      
      def worker():
          print('This is a worker thread')
      
      t = threading.Thread(target = worker)
      t.start()
      t.join()
      
    • 与多进程类似,这里定义了一个函数 worker,通过创建 Thread 类的实例,将 worker 函数作为目标函数,然后启动和等待线程。

2.3 线程同步机制

  • 锁(Lock
    • 示例:
      import threading
      
      counter = 0
      lock = threading.Lock()
      
      def increment():
          global counter
          for _ in range(10000):
              lock.acquire()
              try:
                  counter += 1
              finally:
                  lock.release()
      
      t1 = threading.Thread(target = increment)
      t2 = threading.Thread(target = increment)
      t1.start()
      t2.start()
      t1.join()
      t2.join()
      print(counter)
      
    • 当多个线程访问共享资源(如这里的 counter)时,需要使用锁来保证数据的正确性。lock.acquire() 用于获取锁,lock.release() 用于释放锁。
  • 条件变量(Condition
    • 示例:
      import threading
      
      condition = threading.Condition()
      data = []
      
      def producer():
          global data
          with condition:
              for i in range(10):
                  data.append(i)
                  condition.notify()
      
      def consumer():
          global data
          with condition:
              while not data:
                  condition.wait()
              item = data.pop()
              print(item)
      
      t1 = threading.Thread(target = producer)
      t2 = threading.Thread(target = consumer)
      t1.start()
      t2.start()
      t1.join()
      t2.join()
      
    • 条件变量用于在线程之间进行更复杂的同步操作,比如当某个条件满足时通知其他线程。

2.4 优点

  • 轻量级:线程相比于进程占用更少的系统资源,创建和销毁线程的开销相对较小。
  • 方便共享数据:同一进程内的线程可以直接共享数据,无需复杂的通信机制(但需要注意同步问题)。

2.5 缺点

  • 全局解释器锁(GIL):在CPython(Python的官方实现)中,存在全局解释器锁,这限制了多线程在多核CPU上的并行性。在同一时刻,只有一个线程可以执行Python字节码,所以多线程在计算密集型任务上可能无法充分利用多核优势。
  • 数据同步问题:由于线程共享数据,如果没有正确的同步机制,很容易导致数据不一致、竞争条件等问题。

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

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

相关文章

mycat读写分离中间件

5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…

PyQt5与Html的关于地图位置显示的动态交互

PyQt5与Html的关于地图位置显示的动态交互 1 前言2 python部分3 HTML代码4 注意总结 1 前言 上篇本是放弃关于Folium的动态显示,但是在仔细对比Folium在python的直接应用与Html中的写法,其实两者没有什么区别,都是基于Leaflet上建立区域&…

[大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究

[大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究 目录 文章目录 [大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究目录文章研究背景 文章标题摘要1 引言2 相关工作3 数据集创建3.1 数据收集3.2 目标提示生成3.3 数据集注…

[ACS_C]:以 H2和 O2等离子体处理的 Al2O3为载体的 Pt 催化剂用于液态有机氢载体对二苄基甲苯和全氢二苄基甲苯的加氢和脱氢

摘要:二苄基甲苯 (DBT) 是一种很有前途的液态有机氢载体 (LOHC),理论储氢量为 6.2 wt%,可与可再生能源发电系统耦合。本工作采用一种方便、环保的等离子体处理方法改性氧化铝表面羟基和表面氧空位 (SOV)。通过浸渍处理后的氧化铝制备了不同的…

如何修复变砖的手机并恢复丢失的数据

您可能之前听说过“变砖”,但您知道什么是变砖手机吗?正如许多论坛中经常提出的问题一样,我如何知道我的手机是否变砖了?好吧,手机变砖主要有两种类型,即软件变砖和硬变砖。软变砖手机意味着重启后您仍然可…

MATLAB guide选择图片和全局变量使用

文章目录 前言一、按键选取文件二、全局化变量使用全局华使用 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文内容,下面案例可供参考 一、按键选取文件 [filename,pathname]…

想要编辑 PDF 文件?使用这 10 种最佳 PDF 编辑工具

您是否遇到过利益干系人要求您对 PDF 文件进行细微更改的情况? 通常我们会这样做! 但是,对你来说,做出要求的改变有多难呢? 好吧,当您没有用于创建 PDF 文件的源文件时,问题就来了。是的&…

如何选购适合自己的内衣洗衣机?五款热门卓越型号测评推荐

相信不少小伙伴都跟我一样,一方面,认为内裤、袜子与大件的上衣、裤子放一块清洗,会感觉很不卫生,而且穿在身上也不安心。但是另一方面,本身又很懒惰,也不想自己用手洗,不但经常会遗漏一些污渍&a…

探索 DaPy:Python 中的 AI 数据处理新贵

文章目录 探索 DaPy:Python 中的 AI 数据处理新贵背景介绍DaPy 是什么?如何安装 DaPy?DaPy 的简单函数使用方法加载数据数据筛选数据聚合数据可视化自定义函数 DaPy 在实际场景中的应用数据预处理数据分析数据处理与集成 常见 Bug 及解决方案…

蓝牙资讯|2024可穿戴市场的手表将出现下滑,耳机和戒指将增长

市场调查机构 IDC 发布博文,预测 2024 年全球可穿戴设备出货量达到 5.379 亿台,同比增长 6.1%。IDC 预计新兴市场的进一步普及和成熟市场的更新周期的开始将推动听力设备的发展,因为消费者希望更换大流行病时期购买的产品。 IDC 预估 2024 …

VS2017安装Installer Projects制作Setup包

下载安装扩展包 VS2017默认未安装Installer Projects Package,需要联机下载: 也可网页上下载离线InstallerProjects.vsix文件: https://visualstudioclient.gallerycdn.vsassets.io/extensions/visualstudioclient/microsoftvisualstudio20…

Spring Boot 进阶-Spring Boot 如何实现自定义的过滤器详解

在上一篇文章中我们讲解了关于拦截器的相关内容,并且通过一个防抖的例子来讲解了拦截器在实际开发中的使用。这篇文章我们为大家带来的就是关于过滤器的相关内容的分享。下面我们首先来介绍一下什么是过滤器。 什么是过滤器? 过滤器Filter,是Servlet技术中最常用的技术,开…

K8S精进之路-控制器DaemonSet -(3)

介绍 DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用,每个节点就只有一个。比如最常用的网络组件,存储插件,日志插件,监控插件就是这种类型的pod.如果集群中有新的节点加入,DaemonSet也会在新的节点创建出来…

【Router】路由功能之DMZ(Demilitarized Zone)功能介绍及实现

DMZ(Demilitarized Zone) DMZ(非军事化区域)是一个位于内部网络和外部网络之间的分段区域。在一个网络中,DMZ通常包含运行公共服务的服务器或其他设备。 DMZ是一个位于内部网络和外部网络之间的分段区域,用…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…

【笔记】Java 栈 java.util.Stack

目标:了解Java编程语言里栈和队列是什么样的。 概念 在Java中,Stack 类表示一个后进先出(LIFO,Last-In-First-Out)的对象栈。它继承自 Vector 类,并提供了五个操作,允许将向量(Vector)视为栈来处理。这些操作包括常用的: 压栈(push)出栈(pop)操作用于查看栈顶元…

物理加密机的高性能操作

物理加密机,也被称为硬件安全模块(HSM)或加密锁,是一种用于保护敏感数据和软件应用的物理设备。以下是关于物理加密机的详细介绍: 一、定义与功能 物理加密机通过提供强大的加密功能和访问控制,确保数据在存储、处理和传输过程中的…

GIS--为研究区准备数据

一、实验目的 掌握空间数据的分幅组织方法,掌握常用的空间数据处理技术 二、实验内容 计算图幅号;空间配准、投影定义、投影转换;拼接、裁切,获取研究区内的土地利用数据 三、实验原理与方法 实验原理:空间数据组…

【火狐浏览器 - 数据同步】使用Mozilla账户登录

不要使用火狐通行证 解决方法 在国内下载 开发版本的firefox, 即可数据同步 https://www.mozilla.org/zh-CN/firefox/all/ 登录成功 其他 如果还不同步, 试下这个插件 http://mozilla.com.cn/thread-343905-1-1.html

可控硅光耦——工业自动化智能转型的护航先锋

随着工业自动化程度的持续深化,对安全性、可靠性和智能化水平的要求愈发严苛。在这一浪潮中,可控硅光耦凭借其卓越性能,正逐渐成为工业自动化领域的核心驱动力。本文将深入探讨可控硅光耦在工业自动化智能转型中的创新应用与价值。 提升生产…