我是Pyro的新手,而Python是新手。
我有以下设置:2个python脚本
这是server.py:
import os
import sys
import Pyro4
class Packet(object):
must_shutdown = False
def __init__(self):
self.some_attr = ""
def close_connection(self):
self.must_shutdown=True
def main():
try:
daemon = Pyro4.Daemon(host="localhost", port=65432)
packet = Packet()
uri = daemon.register(packet, "my.packet")
print "Ready. Object uri =", uri
daemon.requestLoop(loopCondition=lambda: not packet.must_shutdown)
print "after loop"
except Exception, e:
print "Exception" + str(e)
finally:
print "Finally"
if __name__ == '__main__':
main()
这是client.py:
import os
import sys
import Pyro4
def main():
try:
packet = Pyro4.Proxy("PYRO:my.packet@localhost:65432")
packet.some_attr = "this is client"
packet.close_connection()
print "client exiting"
except Exception, e:
print "Exception: " + str(e)
finally:
print "Finnally"
if __name__ == '__main__':
main()
您注意到,在server.py
的{{1}}中,有一个 loopCondition “正在监听”,以便 packet.must_shutdown 更改为True 。我先开始requestloop
,然后再开始server.py
。 client.py
中的Pyro数据包对象已成功获取。
问题是,即使我在Pyro Packet对象上调用client.py
方法,从而将close_connection
设置为“ True”, requestLoop也不会中断,服务器仍在监听要求。我登录close_connection ,它被调用,但有趣的是must_shutdown
仍然仍然为空,甚至认为它是在{ {1}}。就像客户端以某种方式处理Packet对象的另一实例而不是服务器中实例化的一样。我在这里想念什么?
答案 0 :(得分:0)
我在此线程中发现了我的问题,可以将其视为重复的问题:requestloop(loopCondition) doesn't release even after loopCondition is False。问题是我没有设置Pyro4.config.COMMTIMEOUT,默认情况下将其设置为0,由于某种原因,它不关心检查requestLoop条件是否得到满足。这在requestLoop文档中未指定!
但是我遇到了一个奇怪的行为,我认为这是Pyro4内部的一个错误。
答案 1 :(得分:-1)
解决我在他的评论中提到的问题可能会为您提供答案。
最值得注意的是; https://pyro4.readthedocs.io/en/stable/clientcode.html#accessing-remote-attributes 它显示“您可以直接通过代理访问远程对象的公开的属性”。 (强调)