以下是我的尝试:
deferred.defer(class1().method1, class2.method2, arg)
deferred.defer(class1().method1, class2.method2(), arg)
这两个都失败并出现错误:
Can't pickle <type 'instancemethod'>: it's not found as __builtin__.instancemethod
在另一篇关于如何挑选实例方法的文章中,建议使用Steven Bethard的解决方案:http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods(在页面底部)
代码丢失了格式,我无法成功使用代码来解决延迟问题。
答案 0 :(得分:5)
deferred.defer
中使用的函数必须是可直接导入的全局函数。这是因为延迟处理程序几乎肯定会在不同的解释器实例中工作,因此必须由它导入有问题的函数。
如果代码中的class1
引用了实际的类名,解决问题的最简单方法是将对其方法的调用包装在global函数中并将其传递给defer
:
def deferred_method_call(*args, **kwargs):
class1.method1(*args, **kwargs)
deferred.defer(deferred_method_call, ...)
另一方面,如果class1
只是变量的名称,则指向实际的类,您可能希望将其作为参数传递给函数:
def deferred_method_call(class_, *args, **kwargs):
class_.method1(*args, **kwargs)
deferred.defer(deferred_method_call, class1, ...)
这是有效的,因为类对象(type
的实例)是可选择的,可以作为参数传递给defer
ed函数。