2012-03-10 5 views
0

SPickleでスタックレスpython(2.7.2)を使用して、セロリ上でテストメソッドを送信して別のマシンで実行しようとしました。私はテストメソッド(コード)をpickleに含めて、実行マシンのpythonパス上に強制的に存在させたくないと思います。RPCを実行せずにSPickleを使用してタスクレットコード(exec状態だけでなく)をシリアル化することはできますか?

には、次のプレゼンテーション参照されて:

クライアントコード:

RPCの例チェックポイントスライド11に示された技術は、我々はセロリを使用していることを与えられないと思える使用しようと https://ep2012.europython.eu/conference/talks/advanced-pickling-with-stackless-python-and-spickle

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) 

動的にロードされたモジュールは、異なる呼び出し、つまり異なるリモート呼び出しによって持続しないようです。

答えて

1

test_methodを独自のモジュール内に定義する必要があります。現在、sickleは、インポート可能なモジュールに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あなたが同意する場合、あなたにチェックを与えるでしょう。 –

関連する問題