[英]Asynchronous API calls in loop python
我正在尝试使用Tweepy
的statuses_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.