簡體   English   中英

從python的協程對象中檢索數據

[英]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)

請參閱官方文檔以了解有關如何使用gatherwait甚至更多選項的更多信息

注意:如果您使用的是最新的 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()

python asyncio add_done_callback with async def

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM