2011-12-15 5 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)")で同期の問題が発生しますか?私の推測から、値 "fun(a)"を持つ変数 "c"が各ipengieで作成されます。 2つのスレッドが異なるパラメータと同時に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) 
関連する問題