一文掌握Python多线程与多进程

这篇具有很好参考价值的文章主要介绍了一文掌握Python多线程与多进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python的多线程和多进程

一、简介

并发是今天计算机编程中的一项重要能力,尤其是在面对需要大量计算或I/O操作的任务时。Python 提供了多种并发的处理方式,本篇文章将深入探讨其中的两种:多线程与多进程,解析其使用场景、优点、缺点,并结合代码例子深入解读。

二、多线程

Python中的线程是利用threading模块实现的。线程是在同一个进程中运行的不同任务。

2.1 线程的基本使用

在Python中创建和启动线程很简单。下面是一个简单的例子:

import threading
import time

def print_numbers():
    for i in range(10):
        time.sleep(1)
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        time.sleep(1.5)
        print(letter)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

在这个例子中,print_numbersprint_letters函数都在各自的线程中执行,彼此互不干扰。

2.2 线程同步

由于线程共享内存,因此线程间的数据是可以互相访问的。但是,当多个线程同时修改数据时就会出现问题。为了解决这个问题,我们需要使用线程同步工具,如锁(Lock)和条件(Condition)等。

import threading

class BankAccount:
    def __init__(self):
        self.balance = 100  # 共享数据
        self.lock = threading.Lock()

    def deposit(self, amount):
        with self.lock:  # 使用锁进行线程同步
            balance = self.balance
            balance += amount
            self.balance = balance

    def withdraw(self, amount):
        with self.lock:  # 使用锁进行线程同步
            balance = self.balance
            balance -= amount
            self.balance = balance

account = BankAccount()

特别说明:Python的线程虽然受到全局解释器锁(GIL)的限制,但是对于IO密集型任务(如网络IO或者磁盘IO),使用多线程可以显著提高程序的执行效率。

三、多进程

Python中的进程是通过multiprocessing模块实现的。进程是操作系统中的一个执行实体,每个进程都有自己的内存空间,彼此互不影响。

3.1 进程的基本使用

在Python中创建和启动进程也是非常简单的:

from multiprocessing import Process
import os

def greet(name):
    print(f'Hello {name}, I am process {os.getpid()}')

if __name__ == '__main__':
    process = Process(target=greet, args=('Bob',))
    process.start()
    process.join()

3.2 进程间的通信

由于进程不共享内存,因此进程间通信(IPC)需要使用特定的机制,如管道(Pipe)、队列(Queue)等。

from multiprocessing import Process, Queue

def worker(q):
    q.put('Hello from

 process')

if __name__ == '__main__':
    q = Queue()
    process = Process(target=worker, args=(q,))
    process.start()
    process.join()

    print(q.get())  # Prints: Hello from process

特别说明:Python的多进程对于计算密集型任务是一个很好的选择,因为每个进程都有自己的Python解释器和内存空间,可以并行计算。

One More Thing

让我们再深入地看一下concurrent.futures模块,这是一个在Python中同时处理多线程和多进程的更高级的工具。concurrent.futures

块提供了一个高级的接口,将异步执行的任务放入到线程或者进程的池中,然后通过future对象来获取执行结果。这个模块使得处理线程和进程变得更简单。

下面是一个例子:

from concurrent.futures import ThreadPoolExecutor, as_completed

def worker(x):
    return x * x

with ThreadPoolExecutor(max_workers=4) as executor:
    futures = {executor.submit(worker, x) for x in range(10)}
    for future in as_completed(futures):
        print(future.result())

这个代码创建了一个线程池,并且向线程池提交了10个任务。然后,通过future对象获取每个任务的结果。这里的as_completed函数提供了一种处理完成的future的方式。

通过这种方式,你可以轻松地切换线程和进程,只需要将ThreadPoolExecutor更改为ProcessPoolExecutor

无论你是处理IO密集型任务还是计算密集型任务,Python的多线程和多进程都提供了很好的解决方案。理解它们的运行机制和适用场景,可以帮助你更好地设计和优化你的程序。

如有帮助,请多关注
个人微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。文章来源地址https://www.toymoban.com/news/detail-491676.html

到了这里,关于一文掌握Python多线程与多进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(47)
  • Python多线程Thread——生产者消费者模型 python队列与多线程——生产者消费者模型

    下面面向对象的角度看线程 那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。

    2024年02月09日
    浏览(55)
  • Python爬虫| 一文掌握XPath

    本篇文章主要介绍利用 Python爬虫爬取付费文章 ,适合练习爬虫基础同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧! ☀️大家好!我是新人小白博主朦胧的雨梦,希望大家多多关照和支持😝😝😝 🌖大家一起努力,共同成长,相信我们都会

    2024年02月05日
    浏览(48)
  • 【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

    目录   专栏导读  4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新:

    2024年02月12日
    浏览(50)
  • 一文掌握python常用的tuple(元组)操作

    目录 1. 元组的创建 2. 访问元组元素 3. 切片操作 4. 合并元组 5. 复制元组 6. 内置函数与方法 7. 元组拆分 8. 星号表达式在元组中的应用 9. 遍历元组 10. 元组的嵌套 11. 元组与条件判断和逻辑运算 12. 常见应用场景 13. 元组与枚举(Enum) 14. 元组推导式 15. 元组与匿名函数(Lambd

    2024年03月09日
    浏览(46)
  • 【Python】一文带你掌握数据容器之集合,字典

    思考:我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: (1)列表可修改、 支持重复元素且有序 (2)元组、字符串不可修改、 支持重复元素且有序 大家有没有看出一些局限? 局限就在于:

    2024年02月05日
    浏览(47)
  • 一文掌握 Python、Anaconda、PyCharm 的安装和使用

    本文将介绍一个较为全面的 Python 开发环境的搭建与基本使用,包括 Python 解释器的安装使用、PyCharm 编辑器的安装使用、Anaconda 的安装使用和库管理工具 pip 的使用。 PyCharm + Anaconda 是一个很完备的 Python 开发环境,也是绝大多数开发者使用的开发方式。资深开发者与初学者都

    2023年04月19日
    浏览(49)
  • 【Python】进阶学习:一文掌握resize方法,轻松调整图像大小

    【Python】进阶学习:一文带你使用resize方法调整image对象的图像大小 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多

    2024年04月25日
    浏览(69)
  • Redis的单线程与多线程

    Redis的核心处理逻辑一直都是单线程 有一些分支模块是多线程 (某些异步流程从4.0开始用的多线程,例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的删除操作。网络I/O解包从6.0开始用的是多线程;) 多线程多好啊可以利用多核优势 官方给的解释 意思就是Redis的定位,是内存k-v存储

    2024年02月13日
    浏览(75)
  • 由浅入深掌握各种 Python 进程间通信方式(建议收藏)

    转载本文请注明 CSDN 链接处: https://blog.csdn.net/captain5339/article/details/129099833 Python代码效率由于受制于GIL全局锁限制,多线程不能利用多核CPU来加速,而 多进程 方式却可以绕过GIL限制, 发挥多CPU加速的优势,达到提高程序的性能的目的。 然而进程间通信却是不得不考虑的问题。

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包