首页 > 系统相关 >Python 中的多线程与多进程

Python 中的多线程与多进程

时间:2025-01-04 09:01:48浏览次数:3  
标签:__ Python print 线程 进程 多线程

Python 中的多线程与多进程

引言

在现代计算环境中,有效地利用计算机资源是提高应用程序性能和响应速度的关键。Python 提供了两种主要的方式来进行并发编程:多线程(Multithreading)和多进程(Multiprocessing)。这两种方法都旨在通过并行执行任务来提升效率,但它们适用于不同的场景,并且有着各自的优缺点。


多线程 (Multithreading)

什么是多线程?

多线程是指一个程序或进程中同时存在多个线程。每个线程都是轻量级的独立执行路径,可以在同一个进程中共享内存和其他资源。这使得线程之间的通信变得非常容易,但也意味着如果一个线程崩溃,它可能会影响到整个进程中的其他线程。

Python 的多线程实现

Python 内置了 threading 模块来支持多线程编程。下面是一个简单的例子,展示了如何创建和启动线程:

import threading
import time

def print_numbers():
    for i in range(5):
        print(f"Number {i}")
        time.sleep(1)

def print_letters():
    for letter in 'ABCDE':
        print(f"Letter {letter}")
        time.sleep(1)

if __name__ == "__main__":
    t1 = threading.Thread(target=print_numbers)
    t2 = threading.Thread(target=print_letters)

    t1.start()
    t2.start()

    t1.join()  # 等待t1完成
    t2.join()  # 等待t2完成

    print("Done!")

在这个例子中,两个函数将几乎同时开始执行,并交替打印数字和字母。start() 方法用于启动线程,而 join() 则确保主线程等待子线程结束。

GIL 与多线程

需要注意的是,CPython 解释器有一个全局解释器锁(Global Interpreter Lock, GIL),它在同一时刻只允许一个线程执行字节码。因此,在 I/O 密集型任务中,多线程可以带来明显的性能改进;但对于 CPU 密集型任务,由于 GIL 的存在,多线程并不能有效提高性能。


多进程 (Multiprocessing)

什么是多进程?

多进程是指操作系统为每个进程分配独立的地址空间,这意味着每个进程都有自己的内存和系统资源。相比于多线程,多进程更加安全可靠,因为一个进程的崩溃不会影响到另一个进程。

Python 的多进程实现

Python 的 multiprocessing 模块提供了类似于 threading 的 API 来创建和管理进程。以下是一个简单的例子:

from multiprocessing import Process
import os
import time

def info(title):
    print(f"{title} - parent process id: {os.getppid()}, process id: {os.getpid()}")

def f(name):
    info('function f')
    print(f'Hello, {name}')

if __name__ == '__main__':
    info('Main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

    print("Done!")

在这个例子中,我们使用 Process 类来创建新进程。与多线程不同,这里没有 GIL 的限制,所以对于 CPU 密集型任务,多进程能够真正实现并行计算。

进程间通信

进程之间不像线程那样可以直接共享数据,因此需要使用特殊的机制来进行通信。multiprocessing 模块提供了多种工具,如队列(Queue)、管道(Pipe)等,以支持进程间的通信。

Pool 池化技术

当需要运行大量相似的任务时,使用 Pool 可以简化代码并优化资源使用。Pool 创建了一组工作进程,并自动管理它们之间的任务分配。

from multiprocessing import Pool

def square(x):
    return x * x

if __name__ == '__main__':
    with Pool(processes=4) as pool:  # 创建包含4个进程的池
        results = pool.map(square, range(10))
        print(results)

多线程 vs. 多进程

  • 适用场景

    • 多线程适合处理I/O密集型任务(例如网络请求、文件读写等),因为它可以避免长时间阻塞。
    • 多进程更适合CPU密集型任务(例如图像处理、科学计算等),因为它们不受GIL的影响。
  • 资源共享

    • 多线程之间易于共享数据,但由于共享内存模型,也更容易出现竞态条件。
    • 多进程有独立的内存空间,虽然更安全,但进程间通信相对较复杂。
  • 开销

    • 创建线程的开销较小,切换成本低。
    • 创建进程的开销较大,尤其是在拥有较多核心的机器上,但可以充分利用多核优势。

结论

选择多线程还是多进程取决于你的具体需求。如果你的应用主要是I/O操作,那么多线程可能是更好的选择;如果是CPU密集型的工作负载,则应该考虑多进程。无论哪种方式,Python 都提供了丰富的库和工具来帮助你构建高效的并发应用程序。

希望这篇博客能为你理解Python中的多线程与多进程提供帮助!如果你有任何问题或者想分享自己的经验,请随时留言讨论。

标签:__,Python,print,线程,进程,多线程
From: https://blog.csdn.net/m0_56896669/article/details/144922212

相关文章

  • 锋哥写一套Python博客系统 基于Django5+BootStrap5视频教程 ,帅呆了~~
    大家好,我是java1234_小锋老师,最近写了一套【Python博客系统基于Django5+BootStrap5视频教程 】视频教程,持续更新中,计划月底更新完,感谢支持。视频在线地址:打造Python博客系统基于Django5+BootStrap5视频教程(火爆连载更新中..)_哔哩哔哩_bilibili项目介绍本课程采用主流......
  • Python多分类Logistic回归详解与实践
    在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题,还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型,并给出详细的代码示例。一、Logistic回归简介Logistic回归是一种线性模型,用于二分类问题。它通......
  • 25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)
    一、JUC简介JUC是java.util.concurrent工具包的简称,这是一个处理线程的工具包,从JDK1.5开始出现二、进程与线程1、基本介绍(1)进程进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础在当代面向线程设......
  • 仿照 github代码提交代码活跃图 Python实现全年运动活跃图
     Python代码如下:1importmatplotlib.pyplotasplt2importnumpyasnp34#假设有一年的运动数据,每天的运动次数5np.random.seed(0)6activity_data=np.random.randint(0,11,size=365)78#创建一个7天*53周的网格9days_in_week=710weeks......
  • 如何使用 Python 和 FFmpeg 下载 B站视频
    在这篇文章中,我们将讨论如何使用Python脚本结合FFmpeg下载并合并B站视频的流,生成一个完整的视频文件。具体来说,我们将通过B站的API获取视频的音频和视频流,然后使用FFmpeg下载并将它们合并成一个.mp4文件。前提条件Python:你需要安装Python,推荐使用Python3.6或......
  • Python-二分法的进阶与Bisect库详解
    1.1前言:在进阶之前可能很多学过二分法的人都认为二分查找十分简单,但事实不完全如此。比如你是否熟练的知道while的条件有等于时返回究竟是mid还是left,还是right,还是随便返回一个没有等于时又是返回什么……本文将给大家讲解二分法的进阶和bisect库函数的运用,并且再讲解之后......
  • 【华为OD-E卷 - 组合出合法最小数 100分(python、java、c++、js、c)】
    【华为OD-E卷-组合出合法最小数100分(python、java、c++、js、c)】题目给一个数组,数组里面哦都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字输入描述一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,......
  • 基于Python的毕业设计选题题目建议 开题指导
    目录毕设选题数据分析与可视化机器学习与深度学习Web开发选题迷茫选题的重要性更多选题指导最后     大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。大四的同学马上要......
  • DL00684-山体滑坡实例/语义分割检测完整python代码含数据集
    https://item.taobao.com/item.htm?ft=t&id=872378688356山体滑坡是引发重大自然灾害的常见地质现象,尤其在山区、丘陵等地带,滑坡不仅对人民生命财产安全构成威胁,还会造成环境破坏和基础设施损毁。传统的山体滑坡检测方法依赖人工监测、地质勘探和局部传感器,这些方法不仅反应速度......
  • 如何在 Python 中使用 generators 和 yield
     是否曾经需要处理一个大到足以耗尽机器内存的数据集?或者有一个复杂的函数,每次调用时都需要维护内部状态,但这个函数太小,不适合创建自己的类。在这些情况以及更多情况下,Generators和yield语句都能帮上忙。 使用generatorgenerator函数是一种返回懒惰迭代器的特殊函数。g......