异步 API 循环调用 python
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 异步编程的新手,非常感谢任何指导!
协程对象,调用 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 object
s.
调用协程函数只会创建协程对象,就像调用生成器只会创建生成器对象一样。要从协程对象获取实际数据,您需要从另一个协程 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)
我正在尝试使用 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 异步编程的新手,非常感谢任何指导!
协程对象,调用 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 ofcoroutine object
s.
调用协程函数只会创建协程对象,就像调用生成器只会创建生成器对象一样。要从协程对象获取实际数据,您需要从另一个协程 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)