Python并发编程的几种实现方式

 更新时间:2024年10月05日 08:58:19   作者:一点sir  
Python并发编程让程序能同时执行多个任务,Python提供多种并发实现方式,包括多线程、多进程、异步编程等,多线程受全局解释器锁(GIL)影响,在CPU密集型任务上不提升性能,但适合I/O密集型任务,多进程适用于CPU密集型任务

Python 并发编程是指在 Python 中编写能够同时执行多个任务的程序。并发编程在任何一门语言当中都是比较难的,因为会涉及各种各样的问题,在Python当中也不例外。Python 提供了多种方式来实现并发,包括多线程(threading)、多进程(multiprocessing)、异步编程(asyncio),以及一些高级用法concurrent.futures和第三方库如gevent。

多线程 (Threading)

多线程是通过使用 threading 模块来创建和管理线程。线程是轻量级的过程,可以与同一进程中的其他线程共享数据和资源。然而,由于 Python 的全局解释器锁(GIL)的存在,如果用的解释器是CPython的话,那么多线程在 CPU 密集型任务上不会有性能提升的,但是IO密集型的是会有的。

import threading
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    print(f"Worker {num} finished")

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

# Wait for all threads to complete
for t in threads:
    t.join()
print("All workers finished.")

上面的例子中,通过threading模块中的Thread启动了另一个线程,输出中首先出现的是每个线程的启动消息,如 "Worker 0 starting",然后是 "Worker 1 starting" 等等。
接下来是每个线程的完成消息,如 "Worker 0 finished"。由于线程的执行顺序不是固定的,因此实际输出中的线程完成顺序可能会有所不同。

全局解释器锁(GIL)是历史历史遗留下来的问题,在Python3.13可能会得到解决。

多进程 (Multiprocessing)

多进程则可以通过使用 multiprocessing 模块来创建独立的进程。每个进程都有自己的内存空间,因此可以绕过 GIL,适用于 CPU 密集型任务。

from multiprocessing import Process
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    print(f"Worker {num} finished")

processes = []
for i in range(5):
    p = Process(target=worker, args=(i,))
    processes.append(p)
    p.start()

# Wait for all processes to complete
for p in processes:
    p.join()
print("All workers finished.")

多进程与多线程示例类似,但这里是在不同的进程中执行。通过multiprocessing模块中的Process启动了另一个进程,每个进程开始和完成的消息按顺序出现。由于进程之间没有共享内存,每个进程都在独立的环境中运行,因此输出中的完成顺序与启动顺序相同。

异步编程 (Asyncio)

Python 3.4 引入了 asyncio 模块,它是一个用于编写单线程并发代码的模块,使用 async 和 await 关键字。异步编程允许你编写并发代码,以非阻塞的方式运行。这非常适合 I/O 密集型任务,如网络请求、文件操作等。

import asyncio

async def worker(num):
    print(f"Worker {num} starting")
    await asyncio.sleep(2)
    print(f"Worker {num} finished")

async def main():
    tasks = [worker(i) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())
print("All workers finished.")

由于协程是基于事件循环的,因此输出中的完成顺序可能与启动顺序不同。异步编程也是python并发编程中比较重要的一个概念,后面很大篇幅都要围绕这个异步编程来展开的。

使用 concurrent.futures

concurrent.futures 提供了一个高层次的接口来处理并行执行的任务,实际上就是线程池或者进程池的玩意,这个池的概念就是线程或者进程用完不销毁,重复利用,具体后面展开说说。

示例

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    return f"Worker {num} finished"

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker, i) for i in range(5)]

for future in futures:
    print(future.result())

print("All workers finished.")

首先,创建了一个最大容纳 5 个工作线程的线程池。然后,提交了 5 个 worker 任务到线程池中,并立即返回了 5 个 Future 对象。接着,程序遍历这些 Future 对象,等待每个任务完成,并打印它们的返回值。最后,打印所有工作线程已经完成的消息。不过还是那个问题,由于 Python 的全局解释器锁(GIL),在 CPU 密集型任务中,线程池并不会带来性能上的提升。

以上这些方法都可以根据你的具体需求来选择使用。如果你需要进行更多的细节控制或者有特定的性能要求,你还可以考虑使用更底层的 API 或者第三方库。

到此这篇关于Python并发编程的几种实现方式的文章就介绍到这了,更多相关Python并发编程的实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python列出目录下指定文件与子目录的方法

    python列出目录下指定文件与子目录的方法

    这篇文章主要介绍了python列出目录下指定文件与子目录的方法,涉及Python使用os模块与glob操作目录与文件的技巧,需要的朋友可以参考下
    2015-07-07
  • python虚拟环境virtualenv的安装与使用

    python虚拟环境virtualenv的安装与使用

    virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:1. 在没有权限的情况下安装新套件 2. 不同应用可以使用不同的套件版本 3. 套件升级不影响其他应用
    2017-09-09
  • Django celery异步任务实现代码示例

    Django celery异步任务实现代码示例

    这篇文章主要介绍了Django celery异步任务实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 使用python接入微信聊天机器人

    使用python接入微信聊天机器人

    这篇文章主要为大家详细介绍了使用python接入微信聊天机器人,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • 使用python实现excel的Vlookup功能

    使用python实现excel的Vlookup功能

    这篇文章主要介绍了使用python实现excel的Vlookup功能,当我们想要查找的数据量较大时,这时则有请我们的主角VLookup函数出场,那么如何用python实现VLookup呢,需要的朋友可以参考下
    2023-04-04
  • vscode调试django项目的方法

    vscode调试django项目的方法

    这篇文章主要介绍了vscode调试django项目的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python中Celery异步任务队列的具体使用

    Python中Celery异步任务队列的具体使用

    Celery是一个用于处理分布式任务和作业队列的异步任务队列库,本文主要介绍了Python中Celery异步任务队列的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 利用python实现可视化大屏

    利用python实现可视化大屏

    这篇文章主要介绍了利用python实现可视化大屏,文章围绕主题展开对如何利用python实现可视化大屏,需要的小伙伴可以参考一下,希望对你的学习和工作有所帮助
    2022-03-03
  • 使用Gitee自动化部署python脚本的详细过程

    使用Gitee自动化部署python脚本的详细过程

    小编最近在自学python,在学习过程中有好多意向不到的收获,真的很开心,今天重点给大家分享使用Gitee自动化部署python脚本的详细过程,包括安装环境搭建及一些注意事项,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • python+mysql实现个人论文管理系统

    python+mysql实现个人论文管理系统

    这篇文章主要为大家详细介绍了python+mysql实现个人论文管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论