我正在使用pygame在Python中创建一个基于回合制的策略游戏。我发现写插座难以置信,所以我转向Pyro分享游戏板的状态。但是,Pyro似乎无法一次支持超过2个连接。
我正在通过
在localhost上运行名称服务器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")
在这个阶段,我给名字服务器a ^ 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保持忙碌。
但是,打破其中一个活动客户端会让其中一个挂起的客户端开始运行。
我尝试通过“export PYRO_SERVERTYPE = multiplex”来切换线程,但这并未改变行为。最大连接的设置似乎是200.将其设置为1000也无法解决我的问题。
我读过Pyro缺乏可扩展性,但我肯定能够连接至少10个连接?
如何一次将两个以上的客户端连接到Pyro4对象?
答案 0 :(得分:2)
回答我自己的问题,希望这会快速出现在谷歌上!
这不是一个“完美”的答案,但它是一个有效的工作。服务器代码保持不变,但客户端代码变为:
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)
额外的“全球”到处都是因为从不假设。
为什么这样做?因为我建立了连接,访问远程对象,然后删除连接。
我发现这个解决方案非常难看,但我会使用它直到找到“正确”的方式。
答案 1 :(得分:1)
我有类似的问题。我独立地找到了你的global
解决方案,但它没有帮助很长时间,随着应用程序规模的增加,错误又回来了。经过多次反复试验,我想我现在可能已经发现了问题...用户错误。
根据http://pythonhosted.org/Pyro4/nameserver.html,名称服务器本身就是一个代理。所以我确保使用像我的其他pyro代理“
这样的”With“语句with Pyro4.locateNS() as ns:
uri = ns.lookup('Object name')
with Pyro4.proxy(uri) as obj:
obj.SomeMethod()
对于名称服务器的每次引用也会执行相同的操作,例如ns.register('thetest', uri)
调用
答案 2 :(得分:0)
我有完全相同的考虑。但是当我和你运行类似的代码时,我发现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")