0

SPickle でスタックレス python (2.7.2) を使用して、別のマシンで実行するためにセロリ経由でテスト メソッドを送信しようとしています。テスト メソッド (コード) を pickle に含めて、実行マシンの Python パスに強制的に存在させないようにしたいと考えています。

次のプレゼンテーションを参照しています: https://ep2012.europython.eu/conference/talks/advanced-pickling-with-stackless-python-and-spickle

チェックポインティング スライド 11 に示されているテクニックを使用しようとしています。

クライアントコード:

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 呼び出し、つまり別のリモート呼び出しでは持続しないようです。

4

1 に答える 1

1

test_method独自のモジュール内で定義する必要があります。現在、sPickle は test_methodインポート可能なモジュールで定義されているかどうかを検出します。別の方法は__module__、関数の属性をに設定することNoneです。

def test_method():
    pass

test_method.__module__ = None
于 2012-06-24T10:17:10.927 に答える