循环python中的异步API调用

2024-10-01 15:37:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Tweepystatuses_lookupapi调用存储对象列表。对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

^{pr2}$

主要方法如下:

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异步编程的新手,任何指导都将不胜感激!在


Tags: 数据对象函数selfloopid列表len
2条回答

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

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

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

status_lookup也是如此:

^{pr2}$

最外层协同程序的返回值将由run_until_complete返回:

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

Coroutine对象是调用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())

相关问题 更多 >

    热门问题