Python 使用asyncio.gather(func1(),func2()时,数据被覆盖

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

我从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 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()