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

新手上路,请多包涵

问题描述

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 这种已实现异步操作的模块.

阅读 1.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题