1

我一直在阅读 Python 中的弱引用和强引用,特别是关于看起来像的错误

ReferenceError: weakly-referenced object no longer exists

在这里,我有一个基本的 RPC 接口,它将对象从客户端传递到服务器,然后服务器将这些对象保存到预定义的类中。这是我的代码中所有结构的基本概述。注意“标志”的行为:

客户端:

# target = 'file.txt', flags = [(tuple, tuple), (tuple, tuple)]
def file_reminder(self, flags, target):         
    target = os.path.abspath(target)          
    c = rpyc.connect("localhost", port)        
    # flags can be referenced here
    return c.root.file_reminder(flags, target)  

服务器端:

class MyService(rpyc.Service):
     jobs = EventLoop().start()

      # this is what's called from the client side
      def exposed_file_reminder(self, flags, target):
           reminder = FileReminder(flags, target)
           self.jobs.add_reminder(reminder)
           # reminder.flags can be referenced here
           return "Added a new reminder"

class FileReminder(object):
     def __init__(self, flags, target):
         self.flags = flags
         self.target = target

     def __str__(self):
         return str(self.flags) + target

class EventLoop(threading.Thread):
     def __init__(self):
         self.reminders = []

     def add_reminder(self, reminder):
         # reminder.flags can be referenced here
         self.reminders.append(reminder)

     def run(self):
         while True:
             for reminder in self.reminders:
                  # reminder.flags is no longer defined here
                  print reminder

这里的问题是“flags”参数在线程中打印(或在线程的 run() 函数中以任何方式操作)时总是抛出 ReferenceError。注意,目标处理得很好。当我将“标志”更改为不可变的(如字符串)时,不会弹出 ReferenceError。这让我头疼,所以任何帮助都将不胜感激!

4

1 回答 1

0

在 Compound Objects 上使用Python GC,我能够解决这个问题,尽管我不知道它是否是使用“最佳实践”完成的。

这就是我认为的错误:虽然有很多对列表本身的引用,但没有明确引用该列表中的元组。我所做的修复它是在实例化时创建列表的深层副本FileReminder

例如

def __init__(self, flags, target):
    self.flags = []
    for flag in flags:
        flags.append(flag)

这似乎有效!

于 2015-01-30T19:51:23.857 回答