python:并发编程(二)

 前言

本文将和大家一起探讨python的并发编程,涉及到python的并发编程模块,先简单介绍这些模块。后续文章,我们再进行详细使用。你至少应该分别掌握多进程、多线程、多协程的并发模块的一个,也可以分别掌握他们中的多个。模块就像法宝,掌握越多,运用起来就各种爽歪歪。

本文为python并发编程的第二篇,上一篇文章地址如下:

python:并发编程(一)_Lion King的博客-CSDN博客

下一篇文章地址如下:

python:并发编程(三)_Lion King的博客-CSDN博客

一、python内置并发模块

python的并发模块有很多,其中一些比较优秀的模块,被python纳入内置模块。如果我是python,我愿称这些模块最强,要不我不会内置。当然,除了这些模块,还有很多模块值得我们学习,因为他们比内置模块更好用。

1、multiprocessing

multiprocessing提供了进程相关的功能,包括进程的创建、启动、同步等操作。该模块可以实现真正的并行计算,每个进程都有自己独立的解释器和GIL,适用于CPU密集型任务。

在Python中,可以使用multiprocessing模块提供的进程池(Pool)来实现进程池编程。进程池可以方便地创建和管理多个子进程,从而实现并行执行任务的目的。

2、threading

threading提供了线程相关的功能,包括线程的创建、启动、同步等操作。模块实现了基于线程的并发,但由于全局解释器锁(GIL)的存在,多线程并不能实现真正的并行执行,适用于I/O密集型任务。

threading没有线程池。

3、asyncio

asyncio提供了基于协程的异步编程框架。模块使用事件循环和协程来实现非阻塞的异步操作,适用于高性能的I/O密集型任务。

在Python中,并没有协程池这种概念,但asyncio确实有池。可以使用第三方库如asyncio来实现协程和事件循环,从而实现高效的异步编程。asyncio库提供了asyncio.Pool类,它允许创建一个用于协程池的对象,用于协程的调度和执行。

4、concurrent.futures

concurrent.futures提供了高级的并发编程接口,包括线程池和进程池。模块通过ThreadPoolExecutorProcessPoolExecutor类封装了线程和进程的管理,使并发编程更加简单和方便。

二、进程池和线程池的概念

当我们接触一些新概念的时候,每一篇文章都会做相应的补充,这样在理解上,容易达成一致。职位为什么不把这些汇总一起或者做成一个附录,是因为用到的时候来学习,更方便一下。不然,光是学习概念,就是一件漫长的事情,而且还不容易被理解。

1、进程池

进程池是一种并发编程的模式,它允许创建和管理一组预先初始化的进程,用于执行并行任务。进程池通常由一个主进程和多个工作进程组成。

主进程负责创建和管理进程池,以及分配任务给工作进程。工作进程则负责执行实际的任务,并将结果返回给主进程。通过使用进程池,可以减少重复创建和销毁进程的开销,并提高任务执行的效率。它具有如下特点:

(1)预先初始化:进程池在启动时会预先创建一定数量的工作进程,这些进程会一直保持运行状态,等待分配任务。

(2)任务分发:主进程将任务分发给工作进程,通常使用队列(如任务队列)来实现任务的调度和传递。

(3)并行执行:工作进程并行执行任务,每个进程独立运行,可以同时处理多个任务。

(4)进程复用:一旦工作进程完成了一个任务,它会返回到进程池中,准备接收下一个任务,而不是被销毁。

(5)进程管理:进程池负责管理工作进程的创建、销毁和资源分配,使得开发人员可以专注于任务的编写,而不必关注进程的细节。

2、线程池

进程池是一种并发编程的模式,概念与特点基本与进程池类似,我们应该学会举一反三。

三、并发模块的学习方式

我们应该学习这些模块呢?这里提供一些方式供大家选择,而后续的文章,也会基于这些方式给大家一起分享。达成这种共识之后,相信学习将事半功倍。

1、官方文档和教程

阅读官方文档和教程是学习这些模块的最佳途径。Python 官方文档对这些模块提供了详细的说明、用例和示例代码。你可以先浏览官方文档,了解模块的功能和用法。

2、示例代码和案例

寻找一些示例代码和案例来加深理解。通过阅读和运行这些示例代码,你可以更好地理解模块的用法和特性,并学会如何解决实际问题。

3、项目实践与调试

选择一个小型的实践项目,例如编写一个多线程的网络爬虫、一个使用多进程的数据处理任务或一个使用异步编程的 Web 服务器。通过实际项目的开发,你可以更深入地理解这些模块的使用方式和注意事项,并体验到并发编程的好处和挑战。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python并发编程涉及创建子进程、进程池、队列以及进程之间的通信,还包括线程、线程锁和线程同步等内容。 然而,Python并发编程方面存在一些限制。其中一个主要的限制是全局解释器锁(Global Interpreter Lock,GIL)。GIL是Python解释器中的一种机制,它确保同一时间只有一个线程能够执行Python字节码。这意味着在多线程的情况下,只有一个线程能够真正地并发执行Python代码。 GIL是为了解决Python多线程之间数据完整性和状态同步问题而引入的。通过限制同一时间只有一个线程执行Python字节码,GIL简化了对共享资源的管理。例如,当多个线程访问同一个对象时,GIL确保了对象的状态不会被破坏。 然而,由于GIL的存在,Python的多线程无法充分利用多核CPU并发执行。这意味着在某些特定场景下,Python相对于C/C++等语言可能会表现出较慢的速度。 要规避GIL带来的限制,可以考虑以下几种方法: 1. 使用多进程代替多线程:由于每个进程都有自己独立的解释器和GIL,所以多进程可以实现真正的并发执行。 2. 使用C扩展模块:编写一些计算密集型任务的关键部分的C扩展模块,以提高性能。 3. 使用并发编程库:使用像`multiprocessing`、`concurrent.futures`和`asyncio`这样的库,它们提供了更高级别的API,可以更有效地管理并发任务。 请注意,具体的规避方法会根据具体情况而异。在进行并发编程时,建议根据实际需求和场景选择合适的方法来克服GIL带来的限制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python并发编程](https://blog.csdn.net/qq_46092061/article/details/117461858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 并发编程](https://blog.csdn.net/qq_39445165/article/details/124674435)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值