异步 API 循环调用 python

Asynchronous API calls in loop python

我正在尝试使用 Tweepystatuses_lookup api 调用来存储对象列表。每次调用 statuses_lookup 都会接收一个 ID 列表,最多可以包含 100 个 ID。

下面的这个函数接受一个 ID 列表,我试图将从 API 调用返回的所有元数据附加到 tweetData 列表中。

def lookupTweets(self, tweetIds):
    tweetData = []
    i = 0
    while i < len(tweetIds):
        print(i)
        if len(tweetIds) - i > 0:
            statuses = self.status_lookup(tweetIds[i + 99])
        else:
            statuses = self.status_lookup(tweetIds[i, len(tweetIds) - i])

        tweetData.append(statuses)
        i += 100

    return tweetData

这是进行 api 调用的异步函数

async def status_lookup(self, tweets):
        return self.api.statuses_lookup(tweets)

这里是主要方法:

if __name__ == "__main__":
    twitterEngine = TwitterEngine()
    tweets = twitterEngine.ingestData("democratic-candidate-timelines.txt")

    twitterData = twitterEngine.lookupTweets(tweets)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(twitterData))
    print(twitterData)

当我打印 twitterData 的结果时,我得到一个 coroutine objects 的列表。输出看起来像这样:[<coroutine object TwitterEngine.status_lookup at 0x105bd16d0>]。但是,我想要实际的元数据而不是协程对象。

我是 Python 异步编程的新手,非常感谢任何指导!

协程对象,调用 async def 函数的结果,需要与 futures 关联才能访问返回值。

有几种方法可以做到这一点,但如果你有一个协程对象列表,你可以使用 asyncio.gather:

twitterData = twitterEngine.lookupTweets(tweets)
future = asyncio.gather(*twitterData)
loop = asyncio.get_event_loop()
loop.run_until_complete(future)
print(future.result())

When I print the result of twitterData, I get a list of coroutine objects.

调用协程函数只会创建协程对象,就像调用生成器只会创建生成器对象一样。要从协程对象获取实际数据,您需要从另一个协程 await 它,或者在事件循环中 运行 它。在 status_lookup 的情况下,lookupTweets 本身应该是一个 async def 协程,并且它应该 await 状态:

statuses = await self.status_lookup(tweetIds[i + 99])

status_lookup也是如此:

async def status_lookup(self, tweets):
    return await self.api.statuses_lookup(tweets)

最外层协程的return值将return由run_until_complete编辑:

loop = asyncio.get_event_loop()
twitterData = loop.run_until_complete(twitterEngine.lookupTweets(tweets))    
print(twitterData)