Python对象的共享锁

Python对象的共享锁,python,multithreading,locking,Python,Multithreading,Locking,我正在Heroku上用Flask/Gunicorn开发一个小型web应用程序。因为我只是进行原型设计,所以我有一个web进程(dyno),其中一个工作线程由同一个进程启动。web应用程序只是返回一个全局对象的JSON转储,由监视外部web服务的工作线程定期更新。全局对象每15到60分钟更新一次。我的计划是在需要更新全局对象时,在工作线程中使用独占锁,在web线程中使用共享锁,以便同时满足多个请求。不幸的是,Python似乎没有共享锁,只有独占锁。如何确保web线程中的一致性,即如何确保对全局对象

我正在Heroku上用Flask/Gunicorn开发一个小型web应用程序。因为我只是进行原型设计,所以我有一个web进程(dyno),其中一个工作线程由同一个进程启动。web应用程序只是返回一个全局对象的JSON转储,由监视外部web服务的工作线程定期更新。全局对象每15到60分钟更新一次。我的计划是在需要更新全局对象时,在工作线程中使用独占锁,在web线程中使用共享锁,以便同时满足多个请求。不幸的是,Python似乎没有共享锁,只有独占锁。如何确保web线程中的一致性,即如何确保对全局对象的更新是原子的,同时允许对该对象进行多个只读访问?

由于更新非常不频繁,您最好只制作对象的副本,更新副本,然后更新全局变量以指向新对象。python中的简单赋值是原子的,因此您根本不需要任何锁。

可能会重复@univerio,谢谢您的提醒。是的,那里的解决方案适用于这里。我考虑过这一点,但由于对象有许多属性,所以更新仍然可能在一个web线程读取它们时发生,因此web线程获取旧对象的部分属性和更新对象的部分属性。我描述的方案没有发生这种情况。你有一个全局变量。您永远不会更新全局变量指向的对象。复制全局变量指向的对象。此副本必须复制您要更新的任何内容<代码>复制。深度复制将是安全的。然后更新私有副本,最后通过交换变量将新副本发布为全局共享对象。读取器将全局变量复制到临时变量。临时指向的对象永远不会被触及。这基本上是RCU,现在有意义了吗?如果是这样,我会更新原来的帖子。