Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环python中的异步API调用_Python_Async Await_Python Asyncio - Fatal编程技术网

循环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库支持异步吗