Pyro4:远程对象的属性未更改?

时间:2019-09-06 17:19:55

标签: python python-2.7 pyro pyro4

我是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.pyclient.py中的Pyro数据包对象已成功获取。 问题是,即使我在Pyro Packet对象上调用client.py方法,从而将close_connection设置为“ True”, requestLoop也不会中断,服务器仍在监听要求。我登录close_connection ,它被调用,但有趣的是must_shutdown 仍然仍然为空,甚至认为它是在{ {1}}。就像客户端以某种方式处理Packet对象的另一实例而不是服务器中实例化的一样。我在这里想念什么?

2 个答案:

答案 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 它显示“您可以直接通过代理访问远程对象的公开的属性”。 (强调)