我一直在考虑如何在多个进程上实现龙卷风锁。
我有多个进程有相同的共同例程。我不希望C2在C1运行时运行,反之亦然(甚至跨进程)
有人对我如何使用tornado.locks.Lock实现这一点有任何想法吗?
p1 p2 p3
C1 C1 C1
C2 C2 C2编辑
我一直在阅读关于multiprocessing.managers.SyncManager的文章,我启动了一台服务器,然后在自己的龙卷风init中尝试连接到它:
m = SyncManager(address=("", 50000), authkey=b'abc')
m.connect()然后,我获得了一个锁与:
check=lock.acquire(blocking=False)我开始了另一个龙卷风过程,并做了同样的事情。然而,Lock()类为每个进程创建一个单独的实例.如何在多个进程上共享这个相同的对象?
发布于 2016-11-04 08:18:06
您不能用tornado.lock.Lock来做这件事;这是一个单进程同步原语(而且它对multiprocessing SyncManager一无所知)。您可以使用SyncManager.Lock来获得多进程锁,但是它是同步的,所以您无法从异步旋风应用程序中轻松地使用它)。
您将需要与一些外部协调进程交谈,以处理跨多个进程的锁定,即使这样,您也必须处理进程在持有锁时死亡的可能性(因此您需要允许锁以某种方式过期,并处理锁过期而持有锁的进程实际上没有死的情况.)。我建议您使用像etcd或ZooKeeper这样的锁定服务。
发布于 2016-11-04 10:46:59
你好,本,谢谢你以上的回复。我最后使用了锁:
from multiprocessing import Process, Lock在我的main()中,我实例化了Lock()并生成了一个新的进程,它启动了龙卷风服务器。我传递锁(l),然后将其存储在Tor核准应用程序中:
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)我理解您的观点,如果其中一个过程失败了,并需要处理这个案例。这似乎有效,或者您认为这种方法与异步和我正在做的事情有其他问题吗?
谢谢
https://stackoverflow.com/questions/40096399
复制相似问题