从python的协程对象中检索数据

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)

Pyn*_*hia 7

您可以避免使用任务。只需直接将聚集应用到协程即可。如果您对差异感到困惑,这个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:我已从代码中删除了信号量,因为不清楚为什么需要它以及在哪里需要它。


Sco*_* P. 3

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