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)。

如果所有这些问题的答案都是那么您无需执行任何操作,因为单线程异步应用无法并行更新共享资源。