簡體   English   中英

實現tornado.locks.Lock鎖定多個進程

[英]Implementing tornado.locks.Lock over multiple processes

我一直在思考如何在多個進程上實現龍卷風鎖定。

我有多個具有相同協同例程的進程。 我從不希望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()類為每個進程創建一個單獨的實例...我如何在多個進程中共享同一對象?

您無法使用tornado.lock.Lock做到這tornado.lock.Lock 這是一個單進程同步原語(並且它對multiprocessing SyncManager 。您可以使用SyncManager.Lock來獲取多進程鎖,但是它是同步的,因此您無法輕松地從異步Tornado中使用它應用)。

您將需要與一些外部協調進程進行對話,以處理跨多個進程的鎖定,即使如此,您也必須處理一個進程在持有該鎖的同時死亡的可能性(因此,您需要允許鎖以某種方式到期,並且處理鎖到期的事實,而持有該鎖的進程實際上並未死亡...)。 我建議使用諸如etcd或ZooKeeper之類的鎖定服務。

您好Ben,感謝您的上述答復。 我最終從以下位置使用了Lock:

from multiprocessing import Process, Lock

在我的main()我實例化了Lock()並產生了一個新的進程來啟動龍卷風服務器。 我傳遞了鎖(l),然后將其存儲在龍卷風應用程序中:

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)

我了解您的意思是,如果其中一個流程出現問題,需要處理此案。 這似乎可行,或者您是否看到這種與異步有關的方法以及我在做什么?

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM