我有一個Python Pyro4遠程對象的問題,其行爲就好像它們是死鎖一樣。以下是如何重現問題(在Windows中)。啓動名稱服務器:Python Pyro4遠程對象塊(如果它是死鎖的)
set PYRO_HMAC_KEY=some_key
python -m Pyro4.naming
然後運行遠程對象服務器:
import Pyro4
import sys
class Scheduler:
def test(self):
pass
if __name__ == '__main__':
sys.excepthook = Pyro4.util.excepthook
scheduler = Scheduler()
Pyro4.config.HMAC_KEY='some_key'
deamon = Pyro4.Daemon()
ns = Pyro4.locateNS()
ns.register("scheduler", deamon.register(scheduler))
deamon.requestLoop()
然後運行客戶端:
import sys
from multiprocessing import Process
import Pyro4
class BWModule(Process):
def __init__(self):
Process.__init__(self)
self.depth = 1
def run(self):
Pyro4.config.HMAC_KEY='some_key'
self.scheduler = Pyro4.Proxy("PYRONAME:scheduler")
print "1"
sys.stdout.flush()
self.scheduler.test()
print "2"
sys.stdout.flush()
print "depth", self.depth
sys.stdout.flush()
if self.depth < 5:
for i in range(10):
newblock = self.duplicate()
newblock.depth = self.depth + 1
newblock.start()
def duplicate(self):
dup = type(self)()
return dup
if __name__ == '__main__':
sys.excepthook = Pyro4.util.excepthook
No1 = BWModule()
No1.start()
當運行該代碼,我看到印刷信息「深度X「,X從1到3但不多。我還看到在執行結束時(在沒有其他事情發生之前)一堆1沒有相應的2s,這表明調用Pyro遠程對象「self.scheduler.test()」已被阻止。這讓我認爲這是Pyro的問題,而不是流程(例如,如果可能的話,可用的流程將用完)。但是,如果我將進程乘法從10減少到2(即在範圍(2):「在客戶端代碼中」替換「對於範圍(10):」中的i)「,則執行一直到深度5沒有阻塞...
所以這裏是我的問題:什麼是happining?爲什麼它會阻止「爲我在範圍(10):」?對於Pyro4遠程對象或類似的東西是否有可能的「客戶端」進程的限制?這是一個死鎖問題嗎?
謝謝。