2012-03-10 43 views
0

嘗試在SPickle中使用堆棧python(2.7.2)將測試方法通過celery發送到不同機器上執行。我希望測試方法(代碼)包含在pickle中,而不是強制存在於正在執行的機器python路徑中。是否可以在不使用RPC的情況下使用SPickle來序列化tasklet代碼(而不僅僅是exec狀態)?

去過引用下面介紹: 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) 

Server代碼:

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,即不同的遠程調用持續。

回答

1

您必須在其自己的模塊中定義test_method。目前sPickle檢測是否在可導入的模塊中定義了test_method。另一種方法是將函數的__module__屬性設置爲None

def test_method(): 
    pass 

test_method.__module__ = None 
+0

您是否同意sPickle目前沒有內置的模塊依賴關係和在遠程機器上動態加載?我相信當我評估這一點時,我希望sPickle能夠做動態模塊依賴捆綁和沙盒, http://stackoverflow.com/questions/10099326/how-to-do-an-embedded-python-module-for-remote-sandbox-execution。如果你同意,會給你檢查。 – 2012-06-25 19:37:12

相關問題