Python中如何进行异步编程?代码举例讲解

异步编程是一种非阻塞的编程方式,可以提高程序的性能和效率。在Python中主要有三种方式进行异步编程:

1. 使用asyncio库:

  • asyncio是Python 3.4版本引入的标准库,可以编写单线程异步代码。
  • 用法:
import asyncio

async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

asyncio.run(main())

在这个例子中,asyncio.sleep(1)会暂停1秒钟,而不是阻塞主线程。所以,这是一种非阻塞的异步方式。

我们也可以使用asyncio实现TCP服务器:

async def handle_client(reader, writer):
    data = await reader.read(100)
    print(f'Received: {data.decode()}')
    writer.write('Hello\n'.encode())
    await writer.drain()
    writer.close()

async def main():
    server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)

    async with server:
        await server.serve_forever()

asyncio.run(main())

2. 使用aiohttp库:

  • aiohttp是一个异步HTTP框架,基于asyncio
  • 可以轻松编写异步HTTP服务器和客户端。
  • 用法:
import asyncio
import aiohttp

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

async def main():
    async with aiohttp.ClientSession() as session:
        await fetch(session, 'http://httpbin.org/get')

asyncio.run(main())

3. 使用uvicorn创建异步Web服务器:

  • uvicorn是一个基于uvloophttpx的异步Web服务器。
  • 基于ASGI,可以部署Flask.Django等框架的异步版本。
  • 用法:
import uvicorn

app = FastAPI()  # 一个异步Web框架

if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)