一、基本介绍
在 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'])
使用 asyncio
与 aiohttp
进行并发 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
提供了多种并发控制机制,如 Semaphore
、Event
、Lock
等,可以用来控制协程的并发执行。
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())