如何在并行进程中将项目附加到列表 (python-asyncio)?
How to append items to a list in a parallel process (python-asyncio)?
我有一个功能,可以将项目添加到列表中,returns 列表。这些项目是 return 从异步函数编辑的。现在它创建项目,然后一个一个地添加它。
我想并行创建项目并将它们添加到列表中,然后 return 函数的值。我该如何解决?
提前致谢!
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
您的问题的一个简单解决方案是异步收集结果并同时编译结果列表。
这是由 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
此处存在缺少异常处理的问题。您可以 return 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]
我有一个功能,可以将项目添加到列表中,returns 列表。这些项目是 return 从异步函数编辑的。现在它创建项目,然后一个一个地添加它。
我想并行创建项目并将它们添加到列表中,然后 return 函数的值。我该如何解决?
提前致谢!
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
您的问题的一个简单解决方案是异步收集结果并同时编译结果列表。
这是由 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
此处存在缺少异常处理的问题。您可以 return 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]