Hon*_*Bee 5 python whois coroutine python-asyncio python-3.7
我正在尝试学习异步,现在我正在尝试获取一批域的 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())
Run Code Online (Sandbox Code Playgroud)
您可以避免使用任务。只需直接将聚集应用到协程即可。如果您对差异感到困惑,这个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)
Run Code Online (Sandbox Code Playgroud)
请参阅官方文档以了解有关如何使用gather甚至wait更多选项的更多信息
注意:如果您使用的是最新的 python 版本,您还可以简化循环运行,只需
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
注 2:我已从代码中删除了信号量,因为不清楚为什么需要它以及在哪里需要它。
all_parsed_whois = [] # make a global
async def coro(url, sem):
all_parsed_whois.append(await resolv.query(url))
Run Code Online (Sandbox Code Playgroud)
如果您想要数据可用,您可以 task.add_done_callback()
python asyncio add_done_callback 与 async def
| 归档时间: |
|
| 查看次数: |
5299 次 |
| 最近记录: |