-1

我是 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中,requestloop有一个loopCondition “正在侦听” packet.must_shutdown以更改为 True。我开始server.py然后client.py。成功获取其中的Pyro Packet对象client.py。问题是,即使我close_connection在 Pyro Packet 对象上调用方法,因此设置must_shutdown为“True”,requestLoop 不会中断,服务器仍在侦听请求。我登录 close_connection并调用它,但有趣的是它self.some_attr 仍然是,即使它被设置了client.py. 这就像,不知何故,客户端处理 Packet 对象的另一个实例,而不是在服务器中实例化的实例。我在这里缺少什么?

4

2 回答 2

0

我在这个线程中发现了我的问题,这可能被认为是重复的:requestloop(loopCondition) 即使在 loopCondition 为 False 之后也不会释放。问题是我没有设置 Pyro4.config.COMMTIMEOUT 默认设置为 0 并且由于某种原因它不关心检查 requestLoop 条件是否满足。这在 requestLoop 文档中没有指定!

但是我遇到了一个奇怪的行为,我认为这是 Pyro4 中的一个错误。

于 2019-09-09T13:56:03.137 回答
-1

解决我在他的评论中提到的问题可能会为您提供答案。

最为显着地; https://pyro4.readthedocs.io/en/stable/clientcode.html#accessing-remote-attributes 上面写着“您可以通过代理直接访问远程对象的公开属性”。(重点补充)

于 2019-09-08T12:10:15.467 回答