[英]Retrieving data from python's coroutine object
我正在嘗試學習異步,現在我正在嘗試獲取一批域的 whois 信息。 我找到了這個 lib aiowhois ,但是只有幾筆信息,對於我這樣的新手來說還不夠。
這段代碼可以正常工作,但我不知道如何從解析的whois
變量(協程對象)打印數據。
resolv = aiowhois.Whois(timeout=10)
async def coro(url, sem):
parsed_whois = await resolv.query(url)
async def main():
tasks = []
sem = asyncio.Semaphore(4)
for url in domains:
task = asyncio.Task(coro(url, sem))
tasks.append(task)
await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
您可以避免使用任務。 直接將 gather 應用到協程即可。 如果您對差異感到困惑,這個SO QA可能會幫助您(尤其是第二個答案)。
您可以讓每個協程返回其結果,而無需求助於全局變量:
async def coro(url):
return await resolv.query(url)
async def main():
domains = ...
ops = [coro(url) for url in domains]
rets = await asyncio.gather(*ops)
print(rets)
請參閱官方文檔以了解有關如何使用gather
或wait
甚至更多選項的更多信息
注意:如果您使用的是最新的 python 版本,您還可以簡化循環運行
asyncio.run(main())
注 2:我已經從我的代碼中刪除了信號量,因為不清楚您為什么需要它以及在哪里需要它。
all_parsed_whois = [] # make a global
async def coro(url, sem):
all_parsed_whois.append(await resolv.query(url))
如果您希望數據一可用,您可以 task.add_done_callback()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.