由GC收集的Python列表
我一直在阅读Python中的弱引用和强引用,特别是关于看起来像由GC收集的Python列表,python,oop,reference,garbage-collection,rpyc,Python,Oop,Reference,Garbage Collection,Rpyc,我一直在阅读Python中的弱引用和强引用,特别是关于看起来像 ReferenceError: weakly-referenced object no longer exists 这里我有一个基本的RPC接口,它将对象从客户端传递到服务器,然后服务器将这些对象保存到预定义的类中。下面是我代码中所有结构的基本概要。注意“标志”的行为: 客户端: # target = 'file.txt', flags = [(tuple, tuple), (tuple, tuple)] def file_rem
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。注意,目标处理得很好。当我将“flags”更改为不可变(如字符串)时,不会出现ReferenceError。这让我头痛,所以任何帮助都将不胜感激 使用,我能够解决这个问题,尽管我不知道是否使用了“最佳实践”
我认为错误在于:虽然有许多对列表本身的引用,但列表中没有对元组的显式引用。我所做的是在文件提醒的实例化上创建列表的深度副本
比如说
def __init__(self, flags, target):
self.flags = []
for flag in flags:
flags.append(flag)
这似乎有效