我有一个用Python3.5编写的网络应用程序,利用了Python的Asyncio并发处理每个传入的连接。
在每个并发连接上,我想将连接的客户端数据存储在列表中。我担心如果同时有两个客户端连接(这是可能的),那么两个任务都会尝试同时向列表中写入数据,这肯定会引起问题。我该如何解决这个问题?
我有一个用Python3.5编写的网络应用程序,利用了Python的Asyncio并发处理每个传入的连接。
在每个并发连接上,我想将连接的客户端数据存储在列表中。我担心如果同时有两个客户端连接(这是可能的),那么两个任务都会尝试同时向列表中写入数据,这肯定会引起问题。我该如何解决这个问题?
asyncio只在yield points(await
表达式)上进行上下文切换,因此两个并行任务不会同时执行。
但是,如果仍然存在竞争条件(这取决于具体的代码结构),您可以使用asyncio同步原语和队列。
task = asyncio.Task(self._handle_client(client_reader, client_writer)) self.clients[task] = (client_reader, client_writer)
并且在_handle_client
中,该列表被附加到。如果两个客户端恰好同时连接,这会导致问题吗? - Cellydy你的问题中缺少许多信息。
threading.Lock
中。await
)?如果是,则必须将列表包装在asyncio.Lock
中。multiprocessing.Lock
如果所有这些问题的答案都是“否”,那么你不需要做任何事情,因为单线程异步应用程序无法并行更新共享资源。
aiohttp
,它可以为你处理所有相关事项(据我所知)。 - Wayne Werner