浅谈Python之并发任务

一、基本介绍

在 Python 中实现方法的并发执行,通常涉及到多线程、多进程或者异步编程(协程)。

二、并发编程示例

使用 asyncio 模块进行协程并发 : Python 的 asyncio 模块是实现异步 I/O 操作的标准库,它允许你以异步的方式编写并发代码。使用 async def 定义异步函数,然后在事件循环中使用 await 来调用这些函数。你可以使用 asyncio.gather 来并发运行多个协程。

python 复制代码
import asyncio

async def task(name, delay):
    print(f"Task {name} started")
    await asyncio.sleep(delay)
    print(f"Task {name} finished")

async def main():
    task1 = task('A', 1)
    task2 = task('B', 2)
    await asyncio.gather(task1, task2)

asyncio.run(main())

使用线程池concurrent.futures.ThreadPoolExecutor 提供了一个线程池实现,可以用来并发执行多个线程任务。

python 复制代码
from concurrent.futures import ThreadPoolExecutor
import time

def task(name):
    print(f"Task {name} started")
    time.sleep(1)
    print(f"Task {name} finished")

with ThreadPoolExecutor(max_workers=5) as executor:
    executor.map(task, ['A', 'B', 'C', 'D', 'E'])

使用进程池concurrent.futures.ProcessPoolExecutor 类似于线程池,但是它使用多个进程来执行任务,这在 CPU 密集型任务中特别有用。

python 复制代码
from concurrent.futures import ProcessPoolExecutor

def cpu_intensive_task(name):
    print(f"Task {name} started")
    # 模拟 CPU 密集型任务
    return [x * x for x in range(10000)]

with ProcessPoolExecutor(max_workers=4) as executor:
    results = executor.map(cpu_intensive_task, ['A', 'B', 'C', 'D'])

使用 asyncioaiohttp 进行并发 HTTP 请求aiohttp 是一个支持异步请求的 HTTP 客户端/服务端框架,可以与 asyncio 结合使用来并发地发送 HTTP 请求。

python 复制代码
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, f'http://example.com/{i}') for i in range(10)]
        responses = await asyncio.gather(*tasks)
        for response in responses:
            print(response)

asyncio.run(main())

使用 asyncio 的并发控制机制asyncio 提供了多种并发控制机制,如 SemaphoreEventLock 等,可以用来控制协程的并发执行。

python 复制代码
import asyncio

async def limited_task(semaphore):
    async with semaphore:
        print("Task is running")
        await asyncio.sleep(1)
        print("Task finished")

async def main():
    semaphore = asyncio.Semaphore(2)
    tasks = [limited_task(semaphore) for _ in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())
相关推荐
淡水猫.1 分钟前
Fakelocation Server服务器/专业版 ubuntu
运维·服务器·ubuntu
wenyue11218 分钟前
Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
运维·中间件·监控
量子网络14 分钟前
debian 如何进入root
linux·服务器·debian
时光の尘17 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年21 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
运维老司机44 分钟前
Jenkins修改LOGO
运维·自动化·jenkins
D-海漠1 小时前
基础自动化系统的特点
运维·自动化
我言秋日胜春朝★1 小时前
【Linux】进程地址空间
linux·运维·服务器
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
C-cat.1 小时前
Linux|环境变量
linux·运维·服务器