繁体   English   中英

循环python中的异步API调用

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

当我打印twitterData的结果时,我得到了coroutine object s的列表。

调用协程函数只会创建协程对象,就像调用生成器只是创建生成器对象一样。 要从协程对象获取实际数据,您需要从另一个协程中等待它,或者在事件循环中运行它。 如果为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)

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

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

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

有几种方法可以执行此操作,但是如果有协程对象列表,则可以使用asyncio.gather

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM