我正在尝试学习异步,现在我正在尝试获取一批域的whois信息。我找到了这个库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())
答案 0 :(得分:3)
all_parsed_whois = [] # make a global
async def coro(url, sem):
all_parsed_whois.append(await resolv.query(url))
如果您希望数据尽快可用,则可以task.add_done_callback()
答案 1 :(得分:1)
您可以避免使用任务。只需直接将集合应用到协程即可。 如果您对两者之间的差异感到困惑,此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)
请参阅official docs,以了解有关如何使用gather
或wait
或更多选项的更多信息
注意:如果您使用的是最新的python版本,则还可以简化运行循环,只需
asyncio.run(main())
注意2:由于目前尚不清楚您为什么需要它以及在何处不清楚,因此我已从代码中删除了该信号灯。