Pyro4不允许两个以上的客户端访问一个URI(Pyro4 does not allow more

2019-09-22 06:08发布

我使用pygame的Python中创建一个回合策略游戏。 我发现写作插座非常困难的,所以我转过身来,火焰兵分享游戏板上的状态。 然而,火焰兵似乎无法支持在同一时间超过2个连接。

我正在通过本地主机上域名服务器

python -m Pyro4.naming

测试案例“服务器”:

import Pyro4
class Testcase:
    def __init__(self):
        self.values = [1, 2, 3, 10, 20, 30]

    def askvalue(self, i):
        return self.values[i]


daemon = Pyro4.Daemon()
ns = Pyro4.locateNS()

uri = daemon.register(Testcase())
ns.register("thetest", uri)
daemon.requestLoop()

和客户端:

import Pyro4, time

ns = Pyro4.locateNS()

casetester = Pyro4.Proxy("PYRONAME:thetest")

while True:
    print "Accessing remote object:"
    print casetester.askvalue(1)
    print "staying busy"
    time.sleep(10)

从第一两个客户端输出:

/usr/local/lib/python2.7/dist-packages/Pyro4-4.14-py2.7.egg/Pyro4/core.py:155: UserWarning: HMAC_KEY not set, protocol data may not be secure
  warnings.warn("HMAC_KEY not set, protocol data may not be secure")
Accessing remote object:
2
staying busy
Accessing remote object:
2
staying busy

和重复

从第三个客户端的输出:

/usr/local/lib/python2.7/dist-packages/Pyro4-4.14-py2.7.egg/Pyro4/core.py:155: UserWarning: HMAC_KEY not set, protocol data may not be secure
  warnings.warn("HMAC_KEY not set, protocol data may not be secure")
Accessing remote object:

和挂起。

从第四,第五(大概超越所有)客户端输出:

/usr/local/lib/python2.7/dist-packages/Pyro4-4.14-py2.7.egg/Pyro4/core.py:155: UserWarning: HMAC_KEY not set, protocol data may not be secure
  warnings.warn("HMAC_KEY not set, protocol data may not be secure")

在这个阶段,我给了一个域名服务器^ C,和客户端3,4,......给这个输出和崩溃:

Traceback (most recent call last):
  File "client.py", line 3, in <module>
    ns = Pyro4.locateNS()
  File "/usr/local/lib/python2.7/dist-packages/Pyro4-4.14-py2.7.egg/Pyro4/naming.py", line 323, in locateNS
    raise Pyro4.errors.NamingError("Failed to locate the nameserver")
Pyro4.errors.NamingError: Failed to locate the nameserver

同时客户端1和2保持忙碌。

然而,打破了活跃客户中的一个将让挂了子里的一个开始工作。

我已经通过“出口PYRO_SERVERTYPE =多重”试图从线程切换出来,但是这并没有改变行为。 为最大连接数的设置似乎是200将其设置为1000并没有任何解决我的问题。

我读过,热释缺乏可扩展性,但我肯定就能获得至少10个连接?

我怎样才能在同一时间到Pyro4对象两个以上的客户端连接?

Answer 1:

回答我的问题,希望这将出现在谷歌迅速!

这不是一个“完美”的答案,但它是一个工作杂牌。 服务器代码保持不变,但客户端代码变为:

import Pyro4, time


global ns
global casetester

def connect():
    global ns
    global casetester
    ns = Pyro4.locateNS()
    casetester = Pyro4.Proxy("PYRONAME:thetest")

def disconnect():
    global ns
    global casetester
    del ns
    del casetester


while True:
    print "Accessing remote object:"
    connect()
    print casetester.askvalue(1)
    disconnect()
    print "staying busy"
    time.sleep(3)

额外的“全球通”遍,因为从来没有假设的地方。

为什么这项工作? 因为我做一个连接,访问远程对象,然后删除该连接。

我觉得这个解决方案很丑陋,但我会用它,直到我找到“正确”的方式。



Answer 2:

我有一个类似的问题。 我发现独立的global解决方案,但它并没有帮助长,错误回来的应用规模不断扩大。 大量的试验和错误之后,我觉得我现在可能已经发现了这个问题......用户错误。

据http://pythonhosted.org/Pyro4/nameserver.html ,名称服务器本身就是一个代理。 所以,我就确定了他们使用“与”语句就像我的其他烟火代理”

with Pyro4.locateNS() as ns:
  uri = ns.lookup('Object name')
with Pyro4.proxy(uri) as obj:
  obj.SomeMethod()

也做同样的事情在每个参考域名服务器就像在你的ns.register('thetest', uri)的呼叫



Answer 3:

我有完全同样的考虑。 但是,当我和你一起类似的代码,我发现Pyro4(2014-12)没有这样的问题。

我有10个客户同时调用它测试。 它的工作原理相当不错。

我写这情况下,它是我这样的人是有用的。

服务器代码

import Pyro4
import time
class Testcase:
    def __init__(self):
        self.value = 1

    def askvalue(self, i):
        # Simulate doing some work.
        time.sleep(1)

        self.value += 1
        return self.value


daemon = Pyro4.Daemon()
ns = Pyro4.locateNS()

uri = daemon.register(Testcase())
ns.register("thetest", uri)
daemon.requestLoop()

客户

import Pyro4, time

ns = Pyro4.locateNS()

casetester = Pyro4.Proxy("PYRONAME:thetest")

while True:
    print("Accessing remote object:")
    print (casetester.askvalue(1))
    print ("staying busy")


文章来源: Pyro4 does not allow more than two clients to access one URI