2011-12-15 2 views
0

최근에 내 ipcontroller/ipengine 클러스터링 프로그램을 래핑하기 위해 HTTP 서버 영역을 개발하고 싶습니다. 서버는 BaseHTTPServer에서 파생 된 간단한 서버입니다. 서버가 HTTP Get 요청을 받으면 do_GET 메소드는 여러 mec.execute() 메소드를 호출하여 작업을 완료합니다. 다음은 코드 샘플입니다.IPython 병렬 컴퓨팅의 동기화 문제

do_GET 
{ 
b = parameter 
mec.scatter("a", b) 
mec.execute("c=fun(a)") 
d = mec.gather("c") 
write d 
} 

성명 mec.execute ("c = fun (a)")에서 동기화 문제가 발생합니까? 내 추측으로, 변수 "c"는 각 ipengie에서 값 "fun (a)"로 만들어집니다. 두 개의 스레드가 서로 다른 매개 변수로 동시에 do_Get 메서드를 호출하면 ipengine 각각에 "c"값이 생깁니다. 당신은 하나의 병렬 함수 호출 등의 작업을 표현할 수있는 경우에는 다른 요청 사이에 몰래 접근 할 수 없어 (엔진 전역을 터치 할 필요가 없다) 때문에

답변

1

가, 다음, 안전해야 예 :

from IPython import parallel 

rc = parallel.Client() 
view = rc[:] 

@view.parallel(block=True) 
def pfun(a): 
    """each engine will get a chunk of a, not the whole thing""" 
    c = fun(a) 
    return c 

# a will be scattered and c will be gathered 
c = pfun(a) 

그러나 그렇지 않은 경우 가장 쉬운 해결책은 주어진 요청에 대한 변수에 UUID가있는 고유 접미사를 지정하여 작업간에 이름 충돌이 발생하지 않도록하는 것입니다.

import uuid 
suffix = str(uuid.uuid4()).replace('-','') # remove '-' so we have a valid identifier 
a_name = "a_" + suffix 
c_name = "c_" + suffix 
mec.scatter(a_name, b) 
mec.execute("%s = fun(%s)" % (c_name, a_name)) 
d = mec.gather(c_name)