2012-03-10 5 views
0

SPickle과 함께 스택없는 python (2.7.2)을 사용하여 다른 컴퓨터에서 실행되도록 셀러리에 테스트 방법을 보냅니다. 테스트 방법 (코드)을 피클에 포함시키고 파이썬 경로를 실행하는 머신에 존재하지 않게하고 싶습니다.RPC를 수행하지 않고 SPickle을 사용하여 작업 표 코드 (단순한 exec 상태가 아닌)를 직렬화 할 수 있습니까?

갔네 참조 다음과 같은 사항 https://ep2012.europython.eu/conference/talks/advanced-pickling-with-stackless-python-and-spickle

만드는 RPC 예를 들어 우리가 셀러리 사용하고 있음을 주어 잘하지 않는 것 체크 포인트 슬라이드 (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) 
,536,913,632 10 개

결과에 : 나는 잘못을하고있는 무슨 또는이도 가능한 경우

[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을 정의해야합니다. 현재 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. 동의하면 수표를 줄 것입니다. –