Python3 Asyncio 在并发任务之间共享资源
Python3 Asyncio shared resources between concurrent tasks
我有一个用 Python3.5 编写的网络应用程序,它利用了同时处理每个传入连接的 pythons Asyncio。
在每个并发连接上,我想将连接的客户端数据存储在一个列表中。我担心如果两个客户端同时连接(这是可能的),那么两个任务将同时尝试写入列表,这肯定会引发问题。我该如何解决?
asyncio 仅在 屈服点 (await
表达式)上进行上下文切换,因此两个并行任务不会在 相同的 [=19] 处执行=]时间。
但如果仍然存在竞争条件(取决于具体的代码结构),您可以使用 asyncio synchronization primitives and queues.
您的问题中缺少很多信息。
- 你的应用程序是线程化的吗?如果是,那么您必须将列表包装在
threading.Lock
. 中
- 您是否在请求处理程序中的写入(到列表)之间切换上下文(例如使用
await
)?如果是,那么您必须将列表包装在 asyncio.Lock
. 中
- 你做多处理吗?如果是,那么您必须使用
multiprocessing.Lock
- 你的应用是否被分到多台机器上?然后你必须使用一些外部共享数据库(例如Redis)。
如果所有这些问题的答案都是否那么您无需执行任何操作,因为单线程异步应用无法并行更新共享资源。
我有一个用 Python3.5 编写的网络应用程序,它利用了同时处理每个传入连接的 pythons Asyncio。
在每个并发连接上,我想将连接的客户端数据存储在一个列表中。我担心如果两个客户端同时连接(这是可能的),那么两个任务将同时尝试写入列表,这肯定会引发问题。我该如何解决?
asyncio 仅在 屈服点 (await
表达式)上进行上下文切换,因此两个并行任务不会在 相同的 [=19] 处执行=]时间。
但如果仍然存在竞争条件(取决于具体的代码结构),您可以使用 asyncio synchronization primitives and queues.
您的问题中缺少很多信息。
- 你的应用程序是线程化的吗?如果是,那么您必须将列表包装在
threading.Lock
. 中
- 您是否在请求处理程序中的写入(到列表)之间切换上下文(例如使用
await
)?如果是,那么您必须将列表包装在asyncio.Lock
. 中
- 你做多处理吗?如果是,那么您必须使用
multiprocessing.Lock
- 你的应用是否被分到多台机器上?然后你必须使用一些外部共享数据库(例如Redis)。
如果所有这些问题的答案都是否那么您无需执行任何操作,因为单线程异步应用无法并行更新共享资源。