我一直在考虑如何在多个进程上实现龙卷风锁。
我有多个具有相同协同例程的进程。我不希望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)
我理解你的观点,如果其中一个流程失败,将需要处理这种情况。这似乎是工作,或者你看到其他问题与这种方法做异步和我在做什么?
谢谢