Python3 Asyncio在并发任务之间共享资源

时间:2016-08-05 11:20:10

标签: python python-3.x concurrency python-asyncio shared-resource

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

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

2 个答案:

答案 0 :(得分:2)

asyncio仅在 yield points await表达式)上进行上下文切换,因此两个并行任务不会在相同的时间执行。

但如果竞争条件仍然存在(取决于具体的代码结构),您可以使用asyncio synchronization primitivesqueues

答案 1 :(得分:2)

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

  • 你的应用是否有线程?如果是,那么您必须将列表包装在# 2.0.0+ syntax df <- createDataFrame(data.frame(col1=c(1, 2, 2, 5, 6, 5))) collect(select(df, countDistinct(df$col1))) ## count(DISTINCT col1) ## 1 4
  • 您是否在请求处理程序中的写入(到列表)之间切换上下文(例如使用threading.Lock)?如果是,那么您必须将列表包装在await
  • 你做多处理吗?如果是,则必须使用asyncio.Lock
  • 您的应用分为多台机器吗?然后你必须使用一些外部共享数据库(例如Redis)。

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