循环python中的异步API调用
我正在尝试使用循环python中的异步API调用,python,async-await,python-asyncio,Python,Async Await,Python Asyncio,我正在尝试使用Tweepy的status\u lookupapi调用存储对象列表。每次调用status\u lookup都会获取一个ID列表,最多可以包含100个ID 下面的函数接收ID列表,我试图将API调用返回的所有元数据附加到tweetData列表中 def lookupTweets(self, tweetIds): tweetData = [] i = 0 while i < len(tweetIds): print(i) i
Tweepy
的status\u lookup
api调用存储对象列表。每次调用status\u 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
以下是主要方法:
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对象的列表。输出如下所示:[]
。但是,我想要的是实际的元数据,而不是协同路由对象
我是Python异步编程新手,任何指导都将不胜感激 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())
调用async def
函数的结果corroutine对象需要与futures关联以访问返回值
有几种方法可以做到这一点,但如果您有一个协程对象列表,则可以使用asyncio.gather
:
twitterData = twitterEngine.lookupTweets(tweets)
future = asyncio.gather(*twitterData)
loop = asyncio.get_event_loop()
loop.run_until_complete(future)
print(future.result())
当我打印twitterData
的结果时,我得到了coroutine对象的列表
调用协同路由函数只会创建协同路由对象,就像调用生成器只会创建生成器对象一样。要从协同程序对象获取实际数据,您需要等待来自另一个协同程序的数据,或者在事件循环中运行它。在status\u lookup
的情况下,lookupTweets
本身应该是一个async def
corroutine,它应该等待
状态:
statuses = await self.status_lookup(tweetIds[i + 99])
同样的情况也适用于状态查找:
async def status_lookup(self, tweets):
return await self.api.statuses_lookup(tweets)
最外层协同程序的返回值将由run\u返回,直到\u完成:
loop = asyncio.get_event_loop()
twitterData = loop.run_until_complete(twitterEngine.lookupTweets(tweets))
print(twitterData)
当我打印twitterData
的结果时,我得到了coroutine对象的列表
调用协同路由函数只会创建协同路由对象,就像调用生成器只会创建生成器对象一样。要从协同程序对象获取实际数据,您需要等待来自另一个协同程序的数据,或者在事件循环中运行它。在status\u lookup
的情况下,lookupTweets
本身应该是一个async def
corroutine,它应该等待
状态:
statuses = await self.status_lookup(tweetIds[i + 99])
同样的情况也适用于状态查找:
async def status_lookup(self, tweets):
return await self.api.statuses_lookup(tweets)
最外层协同程序的返回值将由run\u返回,直到\u完成:
loop = asyncio.get_event_loop()
twitterData = loop.run_until_complete(twitterEngine.lookupTweets(tweets))
print(twitterData)
当我将status\u lookup
设置为async时,我得到以下错误:TypeError:object ResultSet不能用在'wait'表达式中
@VarunVu似乎status\u lookup
不是一个协程。tweepy asyncio知道吗?当我将status\u lookup
设置为async时,我得到以下错误:TypeError:object ResultSet不能用在'wait'表达式中
@VarunVu似乎status\u lookup
不是一个协程。tweepy asyncio有意识吗?这看起来很有希望,但打印的结果是未来。result()
是一个空列表列表:[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、,它是否显示非空列表?它显示了协同路由对象的列表,如:[,…]
@VarunVu Ah ok。。。只是想确认一下,self.api.statuses\u lookup(tweets)
是否返回了非空的内容?啊,我在切片时犯了一个愚蠢的错误,我用逗号而不是分号!谢谢这看起来很有希望,但是打印future.result()
的结果是空列表的列表:[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]如果您在lookupTweets>中的中的返回之前添加打印(twee,它是否显示非空列表?它显示了协同路由对象的列表,如:[,…]
@VarunVu Ah ok。。。只是想确认一下,self.api.statuses\u lookup(tweets)
是否返回了非空的内容?啊,我在切片时犯了一个愚蠢的错误,我用逗号而不是分号!谢谢tweepy库支持异步吗tweepy库支持异步吗