問題描述
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 這種已實現異步操作的模塊.