我有一个用 Python3.5 编写的网络应用程序,它利用了同时处理每个传入连接的 pythons Asyncio。
在每个并发连接上,我想将连接的客户端数据存储在一个列表中。我担心如果两个客户端同时连接(这是可能的),那么两个任务都会尝试同时写入列表,这肯定会引发问题。我将如何解决这个问题?
我有一个用 Python3.5 编写的网络应用程序,它利用了同时处理每个传入连接的 pythons Asyncio。
在每个并发连接上,我想将连接的客户端数据存储在一个列表中。我担心如果两个客户端同时连接(这是可能的),那么两个任务都会尝试同时写入列表,这肯定会引发问题。我将如何解决这个问题?
asyncio 仅在屈服点(await
表达式)上进行上下文切换,因此不会同时执行两个并行任务。
但是如果竞争条件仍然可能(这取决于具体的代码结构),您可以使用asyncio 同步原语和queues。
您的问题中缺少很多信息。
threading.Lock
.await
您是否在请求处理程序中的写入(到列表)之间切换上下文(例如 use )?如果是,那么您必须将列表包装在asyncio.Lock
.multiprocessing.Lock
如果对所有这些问题的回答是否定的,那么您不必做任何事情,因为单线程异步应用程序无法并行更新共享资源。