从python协程对象检索数据

时间:2019-11-24 20:02:00

标签: python python-3.7 coroutine whois python-asyncio

我正在尝试学习异步,现在我正在尝试获取一批域的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())

2 个答案:

答案 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()

python asyncio add_done_callback with async def

答案 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,以了解有关如何使用gatherwait或更多选项的更多信息

注意:如果您使用的是最新的python版本,则还可以简化运行循环,只需

asyncio.run(main())

注意2:由于目前尚不清楚您为什么需要它以及在何处不清楚,因此我已从代码中删除了该信号灯。