在多个进程上实现tornado.locks.Lock



我一直在考虑如何在多个进程上实现龙卷风锁。

我有多个具有相同协同例程的进程。我不希望C2在运行的同时运行C1,反之亦然(即使跨进程)

有没有人对我如何使用tornado.locks.Lock实现这一点有任何想法?

p1     p2     p3
C1     C1     C1

C2     C2     C2

编辑

我启动了一个服务器,然后在我的龙卷风init我试图连接到它:
  m = SyncManager(address=("", 50000), authkey=b'abc')
  m.connect()

我然后获得了一个锁:

check=lock.acquire(blocking=False)

我开始了另一个龙卷风过程,并做了同样的事情。但是Lock()类为每个进程创建一个单独的实例…我如何在多个进程共享这个相同的对象?

tornado.lock.Lock不能这样做;这是一个单进程同步原语(它不知道任何关于multiprocessing SyncManager的信息)。您可以使用SyncManager.Lock来获得多进程锁,但它是同步的,因此您不能轻松地从异步Tornado应用程序中使用它)。

您需要与一些外部协调进程对话来处理跨多个进程的锁,即使这样,您也必须处理进程在持有锁时死亡的可能性(因此您需要允许锁以某种方式过期,并处理锁在持有它的进程未实际死亡时过期的情况…)。我建议使用etcd或ZooKeeper作为你的锁定服务。

你好,Ben,感谢你的以上回复。我最终使用了来自:

的锁
from multiprocessing import Process, Lock

在我的main()中,我实例化了Lock()并生成了一个启动龙卷风服务器的新进程。我传递锁(l),然后将其存储在tornado应用程序中:

if __name__ =='__main__':
   l=Lock()
   Process(target=runServer,args=(l,8000)).start()
   Process(target=runServer,args=(l,8001)).start()

def runServer(lock,port):
      app=Application(lock,port)
      # start tornado server here
class Application(tornado.web.Application):
   def __init__(self,lock,port):
      # Store the lock
      self.lock=lock

我有一些依赖于等待这个锁释放的协例程,例如,在协例程中,我有以下内容:

        while (not self.lock.acquire(block=False)):
           yield tornado.gen.sleep(.01)

我理解你的观点,如果其中一个流程失败,将需要处理这种情况。这似乎是工作,或者你看到其他问题与这种方法做异步和我在做什么?

谢谢

最新更新