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

问题描述

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

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

平时都是使用 gevent 库和 monkey.patch_all() 实现协程,但发现 gevent 在调度时使用的是 DummyThread 进行操作,不知是否对性能有影响,如下图
Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程?

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

相关代码

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

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

以上是 Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程? 的全部内容, 来源链接: utcz.com/p/937779.html

回到顶部