簡體   English   中英

是否可以在不執行RPC的情況下使用SPickle序列化tasklet代碼(而不僅僅是執行狀態)?

[英]Is it possible to serialize tasklet code (not just exec state) using SPickle without doing a RPC?

嘗試通過SPickle使用無堆棧python(2.7.2)在celery上發送測試方法以在另一台計算機上執行。 我希望測試方法(代碼)包含在泡菜中,並且不被迫存在於執行機器的python路徑中。

一直在參考以下演示文稿: https : //ep2012.europython.eu/conference/talks/advanced-pickling-with-stackless-python-and-spickle

嘗試使用檢查點幻燈片11中顯示的技術。考慮到我們正在使用celery,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:\Python27\lib\site-packages\celery\execute\trace.py", line 153, in trace_task
R = retval = task(*args, **kwargs)
File "c:\Python27\celery_tasks.py", line 16, in test_exec_method
unpickledTasks = pt.loads(pickled_task)
File "c:\Python27\lib\site-packages\sPickle\_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM