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