什么是进行机器间锁定的好方法?

时间:2010-03-15 17:08:55

标签: python linux multithreading mutex

我们的服务器群集包含20台机器,每台机器有10个5个线程的pid。我们想要一些方法来防止任何机器上的任何pid中的任何两个线程同时修改同一个对象。

我们的代码用Python编写并在Linux上运行,如果这有助于缩小范围。

另外,这是一个非常罕见的情况,两个这样的线程想要这样做,所以我们更喜欢优化“只有一个线程需要这个对象”的情况真的很快,即使它意味着“一个线程锁定了这个对象而另一个需要它“案例不是很好。

有哪些最佳做法?

5 个答案:

答案 0 :(得分:5)

如果您想跨机器同步,则需要Distributed Lock Manager

我做了一些快速的谷歌搜索并提出:Stackoverflow。 不幸的是,他们只建议Java版本,但它是一个开始。

如果您正在尝试同步对文件的访问:您的文件系统应该已经有一些锁定服务了。如果不考虑改变它。

答案 1 :(得分:3)

我猜你在谷歌搜索期间遇到了这篇博客文章http://amix.dk/blog/post/19386

作者演示了一个简单的memcachedb接口,它用作虚拟分布式锁管理器。这是一个好主意,memcache可能是你能够与之交互的更快的事情之一。请注意,它确实使用了最近添加的 with 语句。

以下是他博客文章中的一个示例用法:

from __future__ import with_statement
import memcache
from memcached_lock import dist_lock

client = memcache.Client(['127.0.0.1:11211'])
with dist_lock('test', client):
   print 'Is there anybody out there!?'

答案 2 :(得分:1)

使用不可变对象编写代码。编写实现Singleton模式的对象。

使用稳定的分布式消息传递技术,如IPC,Web服务或XML-RPC。

我会看看Twisted。他们为此类任务获得了大量解决方案。

我不会在Python esp中使用关于GIL的线程,我会将Processes用作工作应用程序,并使用如上所述的通信技术进行相互通信。

然后,您的单例类可以出现在其中一个应用程序中,并通过选择的通信技术进行连接。

不是所有接口的快速解决方案,但如果正确完成应该是稳定的。

答案 3 :(得分:1)

如果您可以获得分布式锁管理器的完整基础结构,那么继续使用它。但是这个基础设施不容易设置!但这是一个切实可行的解决方案:

- 将具有最低IP地址的节点指定为主节点 (这意味着如果具有最低IP地址的节点挂起,则具有最低IP地址的新节点将成为新的主节点)

-let所有节点联系主节点以获取对象的锁定。

-let主节点使用本机锁语义来获取锁。

除非您需要完整的群集基础架构和DLM来完成这项工作,否则这将简化操作。

答案 4 :(得分:-3)

可能有更好的方法,但是我会使用线程模块中的Lock类来访问with语句中的“protected”对象,这里有一个例子:

from __future__ import with_statement    
from threading import Lock

mylock = Lock()
with mylock.acquire():
    [ 'do things with protected data here' ]
[ 'the rest of the code' ]

有关锁定用法的更多示例,请查看here

编辑:此解决方案不适合作为线程的此问题。锁定未分发,抱歉