异步编程是一种非阻塞的编程方式,可以提高程序的性能和效率。在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是一个基于
uvloop
和httpx
的异步Web服务器。 - 基于ASGI,可以部署
Flask
.Django
等框架的异步版本。 - 用法:
import uvicorn
app = FastAPI() # 一个异步Web框架
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8000)