Python的django无锁并发处理


并发性不是很直观的。你需要训练你的大脑来考虑当多个进程同时执行某个代码块时会发生什么。我经常遇到的问题有几个。

未能识别潜在的并发性问题。无论是初学者还是经验丰富的开发者,完全错过潜在的并发问题是很常见的。当这种情况发生时,并发问题最终导致bug,通常是很难追踪和调试的。

由于可能性低而忽略了并发问题:如果你认识到一个潜在的并发问题,在某些时候你可能会想 "这发生的可能性有多大..."。当可能性很低时,很容易忽视并发性问题。然而,我个人发现,并发问题往往在最糟糕的时候出现--当你的系统处于巨大的负载之下,而你只有很少的时间(和宽容)来想出一个解决方案。

滥用锁。如果你认识到一个潜在的问题并决定妥善处理,你的下一步通常会涉及某种锁。有时,锁是必要的,但更多的时候,它们可以被避免,或被更多许可的锁所取代。

在这篇文章中,我介绍了常见的并发性挑战以及如何用最小的锁来克服它们。

在这篇文章中,你使用了几种不同的方法来解决两个看似简单的任务中非常常见的并发问题。

创建短的URL

  • #1:未能识别可能的碰撞
  • #2:检查时间的使用时间(TOCTOU)
  • #1: 锁定!
  • #2: 请求锁宽限

递增hit计数器

  •  #3: 忽略竞赛条件
  •  #3:选择进行更新
  •  #4:在数据库中增量
  •  #5:更新并立即返回

这些方法中有些是脆弱的,甚至在小的负载下也会损坏,其他的方法也有其优点和缺点。

详细点击标题