Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程?

发布于 2022-09-12 01:19:54 字数 1624 浏览 40 评论 0

问题描述

demo中有一个 task_check 的模块,底层是用urllib实现,请问如果要实现使用 asyncio 库实现协程操作,需要修改这个模块的底层代码吗?如何修改? 往大佬指点

问题出现的环境背景及自己尝试过哪些方法

平时都是使用 gevent 库和 monkey.patch_all() 实现协程,但发现 gevent 在调度时使用的是 DummyThread 进行操作,不知是否对性能有影响,如下图
image.png

所以想使用 asyncio 模块来实现协程, 但 asyncio 没有类似 monkey.patch_all() 这种模块来实现底层的替换, 翻阅了各类博文也没能理解, 望大佬们指点

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
demo 代码如下

import datetime
import asyncio

class DEMO:
    def __init__(self):
        self.true_count = 0
        self.false_count = 0

    async def task(self):
        from module import task_check
        status = task_check.connect("131.114.2.134")["status"]
        if status:
            self.true_count+=1
        else:
            self.false_count += 1
        print(threading.currentThread().name,datetime.datetime.now(), "task is done, status is", status)

if __name__ == "__main__":
    start = datetime.datetime.now()
    demo = DEMO()
    task_count = 300

    # 批量添加asyncio协程
    tasks = [asyncio.ensure_future(demo.task()) for _ in range(task_count)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))

    # 反馈数据
    end = datetime.datetime.now()
    print("[+] runtime: %s available: %s %%" %(end - start, (demo.true_count / task_count) * 100))

你期待的结果是什么?实际看到的错误信息又是什么?

使用 asyncio 库调用第三方模块实现协程切换, 而非 aiohttp 这种已实现异步操作的模块.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文