我有一个将项目添加到列表并返回列表的函数。这些项从异步函数返回。现在它创建项目,然后一个接一个地添加。
我想并行创建这些项,并将它们添加到列表中,然后返回函数的值。我该如何解决这个问题呢?
提前谢谢你!
async def __create_sockets(self):
rd_data = []
for s in self.symbols.index:
try:
print(f'Collecting data of {s}')
socket = DepthCacheManager(self.client, s, refresh_interval=None)
rd_data.append(await socket.__aenter__())
except:
continue
return rd_data发布于 2021-10-02 14:13:30
您的问题的一个简单解决方案是异步收集结果,同时编译结果列表。
这是由asyncio.gather()调用as explained in the asyncio documentation提供的。看一下这里给出的极好的例子。
在您的示例中,它可能大致如下所示(显然我无法测试它):
async def create_socket(self, s):
print(f'Collecting data of {s}')
socket = DepthCacheManager(self.client, s, refresh_interval=None)
return socket.__aenter__()
async def __create_sockets(self):
rd_data = await asyncio.gather(
*[self.create_socket(s) for s in self.symbols.index]
)
return rd_data这里有一个遗漏异常处理的问题。您可以在发生异常时返回None,然后在以后清理列表,如下所示:
async def create_socket(self, s):
try:
print(f'Collecting data of {s}')
socket = DepthCacheManager(self.client, s, refresh_interval=None)
return await socket.__aenter__() # await is important here
except:
return None
async def __create_sockets(self):
rd_data = await asyncio.gather(
*[self.create_socket(s) for s in self.symbols.index]
)
return [i for i in rd_data if i != None]https://stackoverflow.com/questions/69417401
复制相似问题