Python收集的Python列表

时间:2015-01-30 18:54:11

标签: python oop reference garbage-collection rpyc

我一直在阅读Python中的弱引用和强引用,特别是关于

的错误
ReferenceError: weakly-referenced object no longer exists

这里我有一个基本的RPC接口,可以将对象从客户端传递到服务器,然后服务器将这些对象保存到预定义的类中。这是我的代码中所有结构的基本轮廓。请注意" flags"的行为:

客户方:

# 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

这里的问题是"标志"参数总是在线程中打印时抛出一个ReferenceError(或者在Thread的run()函数中以任何方式操作)。注意,目标处理得很好。当我改变"标志"对于一个不可变的,就像一个字符串,没有出现ReferenceError。这让我头疼,所以任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

使用Python GC on Compound Objects,我能解决这个问题,虽然我不知道是否使用"最佳做法"

这里我认为错误是:虽然列表本身有很多引用,但是没有明确引用该列表中的元组。我做了什么来解决它是在FileReminder的实例化上创建列表的深层副本

例如

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

这似乎有效!