首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个进程上实现tornado.locks.Lock

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

Stack Overflow用户
提问于 2016-10-17 22:02:19
回答 2查看 368关注 0票数 0

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

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

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

代码语言:javascript
复制
p1     p2     p3

C1     C1     C1


C2     C2     C2

编辑

我一直在阅读关于multiprocessing.managers.SyncManager的文章,我启动了一台服务器,然后在自己的龙卷风init中尝试连接到它:

代码语言:javascript
复制
  m = SyncManager(address=("", 50000), authkey=b'abc')
  m.connect()

然后,我获得了一个锁与:

代码语言:javascript
复制
check=lock.acquire(blocking=False)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-04 08:18:06

您不能用tornado.lock.Lock来做这件事;这是一个单进程同步原语(而且它对multiprocessing SyncManager一无所知)。您可以使用SyncManager.Lock来获得多进程锁,但是它是同步的,所以您无法从异步旋风应用程序中轻松地使用它)。

您将需要与一些外部协调进程交谈,以处理跨多个进程的锁定,即使这样,您也必须处理进程在持有锁时死亡的可能性(因此您需要允许锁以某种方式过期,并处理锁过期而持有锁的进程实际上没有死的情况.)。我建议您使用像etcd或ZooKeeper这样的锁定服务。

票数 3
EN

Stack Overflow用户

发布于 2016-11-04 10:46:59

你好,本,谢谢你以上的回复。我最后使用了锁:

代码语言:javascript
复制
from multiprocessing import Process, Lock

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

代码语言:javascript
复制
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

我有一些共同例程,它们依赖于等待这个锁变得自由。例如,在一个共同例程中,我有以下内容:

代码语言:javascript
复制
        while (not self.lock.acquire(block=False)):
           yield tornado.gen.sleep(.01)

我理解您的观点,如果其中一个过程失败了,并需要处理这个案例。这似乎有效,或者您认为这种方法与异步和我正在做的事情有其他问题吗?

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40096399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档