7

我有一个用 Python3.5 编写的网络应用程序,它利用了同时处理每个传入连接的 pythons Asyncio。

在每个并发连接上,我想将连接的客户端数据存储在一个列表中。我担心如果两个客户端同时连接(这是可能的),那么两个任务都会尝试同时写入列表,这肯定会引发问题。我将如何解决这个问题?

4

2 回答 2

6

asyncio 仅在屈服点await表达式)上进行上下文切换,因此不会同时执行两个并行任务

但是如果竞争条件仍然可能(这取决于具体的代码结构),您可以使用asyncio 同步原语queues

于 2016-08-05T14:29:24.290 回答
2

您的问题中缺少很多信息。

  • 您的应用程序是否线程化?如果是,那么您必须将列表包装在threading.Lock.
  • await您是否在请求处理程序中的写入(到列表)之间切换上下文(例如 use )?如果是,那么您必须将列表包装在asyncio.Lock.
  • 你做多处理吗?如果是,那么你必须使用multiprocessing.Lock
  • 您的应用程序是否划分到多台机器上?然后你必须使用一些外部共享数据库(例如 Redis)。

如果对所有这些问题的回答是否定的,那么您不必做任何事情,因为单线程异步应用程序无法并行更新共享资源。

于 2016-08-05T14:41:15.533 回答