如何在并行进程中将项目附加到列表 (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]