Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程?
问题描述
demo中有一个 task_check
的模块,底层是用urllib实现,请问如果要实现使用 asyncio
库实现协程操作,需要修改这个模块的底层代码吗?如何修改? 往大佬指点
问题出现的环境背景及自己尝试过哪些方法
平时都是使用 gevent
库和 monkey.patch_all()
实现协程,但发现 gevent
在调度时使用的是 DummyThread
进行操作,不知是否对性能有影响,如下图
所以想使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论