python并发编程之协程库:探索Python中的协程库

本文探讨了Python中的asyncio、gevent和trio三个主要协程库,通过10个实际场景展示了它们在处理异步IO、并发网络请求、文件操作、定时任务、数据库访问、HTTP服务器和任务队列等方面的应用,帮助理解并发编程和提高程序性能。
摘要由CSDN通过智能技术生成

点击蓝字,关注我们

协程是一种轻量级的并发编程模型,它可以在单线程中实现高效的异步操作。Python提供了多个协程库,其中最常用的是`asyncio`、`gevent`和`trio`。下面我将探索这些协程库,并列举10个实用的场景代码,展示它们在异步编程中的应用。

1. 使用`asyncio`实现异步IO操作:

import asyncio

async def fetch_data(url):
    # 模拟异步IO操作
    await asyncio.sleep(1)
    return f"Data from {url}"

async def main():
    tasks = [
        fetch_data("https://api.example.com/data1"),
        fetch_data("https://api.example.com/data2"),
        fetch_data("https://api.example.com/data3")
    ]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main()))

2. 使用`gevent`实现并发网络请求:

import gevent
import requests

def fetch_data(url):
    response = requests.get(url)
    return response.text

def main():
    urls = [
        "https://api.example.com/data1",
        "https://api.example.com/data2",
        "https://api.example.com/data3"
    ]
    jobs = [gevent.spawn(fetch_data, url) for url in urls]
    gevent.joinall(jobs)
    results = [job.value for job in jobs]
    print(results)

main()

3. 使用`trio`实现异步文件读写:

import trio

async def read_file(file_name):
    async with trio.open_file(file_name, "r") as file:
        data = await file.read()
        return data

async def write_file(file_name, data):
    async with trio.open_file(file_name, "w") as file:
        await file.write(data)

async def main():
    await write_file("output.txt", "Hello, world!")
    data = await read_file("output.txt")
    print(data)

trio.run(main)

4. 使用`asyncio`处理并发任务:

import asyncio

async def task(name):
    print(f"Task {name} started")
    await asyncio.sleep(1)
    print(f"Task {name} completed")

async def main():
    tasks = [task("A"), task("B"), task("C")]
    await asyncio.gather(*tasks)

asyncio.run(main())

5. 使用`gevent`实现并发爬虫:

import gevent
import requests
from gevent import monkey

monkey.patch_all()

def fetch_data(url):
    response = requests.get(url)
    return response.text

def main():
    urls = [
        "https://www.example.com/page1",
        "https://www.example.com/page2",
        "https://www.example.com/page3"
    ]
    jobs = [gevent.spawn(fetch_data, url) for url in urls]
    gevent.joinall(jobs)
    results = [job.value for job in jobs]
    print(results)

main()

6. 使用`trio`实现异步TCP服务器:

import trio

async def handle_client(stream):
    data = await stream.receive_some(1024)
    await stream.send_all(data.upper())
    await stream.aclose()

async def main():
    await trio.serve_tcp(handle_client, port=8000)

trio.run(main)

7. 使用`asyncio`实现定时任务:

import asyncio

async def task():
    while True:
        print("Running task")
        await asyncio.sleep(1)

async def main():
    await asyncio.gather(task(), asyncio.sleep(5))

asyncio.run(main())

8. 使用`gevent`实现并发数据库访问:

import gevent
from gevent import monkey
from gevent.pool import Pool
import psycopg2

monkey.patch_all()

def fetch_data(query):
    conn = psycopg2.connect("dbname=mydatabase user=myuser password=mypassword")
    cursor = conn.cursor()
    cursor.execute(query)
    results = cursor.fetchall()
    cursor.close()
    conn.close()
    return results

def main():
    queries = [
        "SELECT * FROM table1",
        "SELECT * FROM table2",
        "SELECT * FROM table3"
    ]
    pool = Pool(10)
    results = pool.map(fetch_data, queries)
    print(results)

main()

9. 使用`trio`实现异步HTTP服务器:

import trio
from trio_web import serve_websocket, ConnectionClosed

async def handle_websocket(request):
    ws = await request.accept()
    try:
        while True:
            message = await ws.receive_message()
            await ws.send_message(message)
    except ConnectionClosed:
        pass

async def main():
    await serve_websocket(handle_websocket, "0.0.0.0", 8000, ssl_context=None)

trio.run(main)

10. 使用`asyncio`实现异步任务队列:

import asyncio
import random

async def worker(name, queue):
    while True:
        task = await queue.get()
        if task is None:
            break
        print(f"Worker {name} got task: {task}")
        await asyncio.sleep(random.random())

async def main():
    queue = asyncio.Queue()
    workers = [worker("A", queue), worker("B", queue), worker("C", queue)]
    tasks = [f"Task {i}" for i in range(10)]
    random.shuffle(tasks)
    for task in tasks:
        await queue.put(task)
    for _ in workers:
        await queue.put(None)
    await asyncio.gather(*workers)

asyncio.run(main())

这些场景代码展示了`asyncio`、`gevent`和`trio`在异步编程中的应用。它们提供了不同的并发编程模型和工具,适用于不同的应用场景。您可以根据具体需求选择适合的协程库来实现异步操作,并提高程序的性能和并发能力。

希望这些示例代码能够帮助您理解协程库的使用和在异步编程中的应用。如果您有任何进一步的问题,请随时提问。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值