首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在并行进程(python-asyncio)中将项追加到列表中?

如何在并行进程(python-asyncio)中将项追加到列表中?
EN

Stack Overflow用户
提问于 2021-10-02 13:33:11
回答 1查看 135关注 0票数 1

我有一个将项目添加到列表并返回列表的函数。这些项从异步函数返回。现在它创建项目,然后一个接一个地添加。

我想并行创建这些项,并将它们添加到列表中,然后返回函数的值。我该如何解决这个问题呢?

提前谢谢你!

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-02 14:13:30

您的问题的一个简单解决方案是异步收集结果,同时编译结果列表。

这是由asyncio.gather()调用as explained in the asyncio documentation提供的。看一下这里给出的极好的例子。

在您的示例中,它可能大致如下所示(显然我无法测试它):

代码语言:javascript
复制
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,然后在以后清理列表,如下所示:

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69417401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档