尝试将无堆栈python(2.7.2)与SPickle一起使用,通过芹菜发送一个测试方法,以便在不同的机器上执行。我希望测试方法(代码)包含在pickle中,而不是强制存在于执行机器python路径上。
参考了以下演示文稿:https://ep2012.europython.eu/conference/talks/advanced-pickling-with-stackless-python-and-spickle
尝试使用检查点幻灯片11中显示的技术。RPC示例似乎不正确,因为我们使用的是芹菜:
客户代码:
from stackless import run, schedule, tasklet
from sPickle import SPickleTools
def test_method():
print "hello from test method"
tasks = []
test_tasklet = tasklet(test_method)()
tasks.append(test_tasklet)
pt = SPickleTools(serializeableModules=['__test_method__'])
pickled_task = pt.dumps(tasks)
服务器代码:
pt = sPickle.SPickleTools()
unpickledTasks = pt.loads(pickled_task)
结果:
[2012-03-09 14:24:59,104: ERROR/MainProcess] Task
celery_tasks.test_exec_method[8f462bd6-7952-4aa1-9adc-d84ee4a51ea6] raised exception:
AttributeError("'module'
object has no attribute 'test_method'",)
Traceback (most recent call last):
File "c:Python27libsite-packagesceleryexecutetrace.py", line 153, in trace_task
R = retval = task(*args, **kwargs)
File "c:Python27celery_tasks.py", line 16, in test_exec_method
unpickledTasks = pt.loads(pickled_task)
File "c:Python27libsite-packagessPickle_sPickle.py", line 946, in loads
return unpickler.load()
AttributeError: 'module' object has no attribute 'test_method'
有没有关于我所做的不正确的建议,或者这是否可能?
在celeryd中进行动态模块加载的替代建议也很好(作为使用sPickle的替代方案)。我尝试过做:
py_mod = imp.load_source(module_name,'some script path')
sys.modules.setdefault(module_name,py_mod)
但是动态加载的模块似乎不会通过对celeryd的不同调用(即不同的远程调用)而持久存在。
您必须在自己的模块中定义test_method
。当前,sPickle检测test_method
是否在可导入的模块中定义。另一种方法是将函数的__module__
属性设置为None
。
def test_method():
pass
test_method.__module__ = None