Python 使用asyncio.gather(func1(),func2()时,数据被覆盖
我从API请求数据Python 使用asyncio.gather(func1(),func2()时,数据被覆盖,python,asynchronous,python-asyncio,Python,Asynchronous,Python Asyncio,我从API请求数据 async def get_data(request_details): value1, value2 = await api.get_values(request_details) ..some extra calculations return value1, value2 async def routine1(): val1, val2 = await get_data(request_details1) ...do somet
async def get_data(request_details):
value1, value2 = await api.get_values(request_details)
..some extra calculations
return value1, value2
async def routine1():
val1, val2 = await get_data(request_details1)
...do something with val1, val2
async def routine2():
val1, val2 = await get_data(request_details2)
...do something with val1, val2
async def main():
await asyncio.gather(routine1(),routine2())
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
我需要启动这两个例程,以便它们可以异步地完成它们的工作。
结果是,我得到了由get_data()函数返回给我的val1,val2,它们是相同的。
对于routine1(),它们是正确的,但是对于routine2(),它们与routine1()相同
如果我将main()中例程的调用从使用asyncio.gather()更改为
然后它们不会异步启动,但我确实得到了正确的val1和val2。
我错过了什么?为什么我的数据会被覆盖?事实上它是正确的-很可能是
api。您调用的get\u值并不是每个异步调用都是独立的,它们返回相同的值。除了你说哪一个是API,我们看了看它的代码,没有办法正确回答这个问题
由于这是该API中的一个问题,如果它提供了一个同步调用,那么这可能是一个解决方法-然后,在get_data
内的API调用中,而不是等待已损坏的API。get_值
可以使用循环。运行\u in_executor
在单独的线程中调用API的同步版本。如果api是线程安全的,那么它应该可以工作:
async def get_数据(请求_详细信息):
loop=asyncio.get\u event\u loop()
value1,value2=等待循环。在执行器中运行(api.get\u values\u sync,request\u详细信息)
…一些额外的计算
返回值1,值2
事实上,这一切都是正确的-很可能是api。您正在调用的get_值并不是使每个异步调用都保持独立,它们返回相同的值。除了你说哪一个是API,我们看了看它的代码,没有办法正确回答这个问题
由于这是该API中的一个问题,如果它提供了一个同步调用,那么这可能是一个解决方法-然后,在get_data
内的API调用中,而不是等待已损坏的API。get_值
可以使用循环。运行\u in_executor
在单独的线程中调用API的同步版本。如果api是线程安全的,那么它应该可以工作:
async def get_数据(请求_详细信息):
loop=asyncio.get\u event\u loop()
value1,value2=等待循环。在执行器中运行(api.get\u values\u sync,request\u详细信息)
…一些额外的计算
返回值1,值2
发现API响应存在问题。按预期执行的异步IO逻辑发现了API响应的问题。按预期执行异步IO逻辑,尝试检查请求详细信息1
和请求详细信息2
。也许这些错误地包含了相同的对象,这可以解释为什么会得到相同的结果。此外,请尝试添加打印或调试器断点,以更详细地查看出错的地方。目前,您的问题缺少需要回答的详细信息。请求详细信息1,2是不同的对象。请尝试检查请求详细信息1
和请求详细信息2
。也许这些错误地包含了相同的对象,这可以解释为什么会得到相同的结果。此外,请尝试添加打印或调试器断点,以更详细地查看出错的地方。目前,您的问题缺少需要回答的细节。请求详情1、2是不同的对象。
await routine1()
await routine2()