パラレルPythonの:どのように私は「提出」に引数を指定できますか?

StackOverflow https://stackoverflow.com/questions/1546429

  •  20-09-2019
  •  | 
  •  

質問

これは、並列pythonのタグを持つ唯一の2番目の質問です。ドキュメントを見被験者のためにグーグルの後、私はそれは私が答えと提案と最高の幸運を持っていたところだとここに来てます。

次の頁に関連するすべての情報を提出するAPI(私はそれが呼ばれると思う)です。

    def submit(self, func, args=(), depfuncs=(), modules=(),
        callback=None, callbackargs=(), group='default', globals=None):
    """Submits function to the execution queue

        func - function to be executed
        args - tuple with arguments of the 'func'
        depfuncs - tuple with functions which might be called from 'func'
        modules - tuple with module names to import
        callback - callback function which will be called with argument
                list equal to callbackargs+(result,)
                as soon as calculation is done
        callbackargs - additional arguments for callback function
        group - job group, is used when wait(group) is called to wait for
        jobs in a given group to finish
        globals - dictionary from which all modules, functions and classes
        will be imported, for instance: globals=globals()
    """

ここに私は、その引数に声明を提出されます:

job_server.submit(reify, (pop1, pop2, 1000), 
                  depfuncs = (key_seq, Chromosome, Params, Node, Tree), 
                  modules = ("math",), 
                  callback = sum.add, globals = globals())

depfuncsのすべての大文字の名前はクラスの名前です。私はどこのクラスを入れたりしても、私は、彼らがglobals()辞書にあるとしてそれらを含める必要があるかのようにしてくださいませんでした。私は空のdepfuncs()でそれを実行したときしかし、それは、そのような(例えば)「Tree not defined」としてエラーが発生します。

さて、key_seqは、発電機があるので、私は.next()を使用できるようにするために、そのインスタンスで作業する必要があります:

def key_seq():
    a = 0
    while True:
        yield a
        a = a + 1
ks = key_seq()

ksglobals()で定義されています。私はどこにもそれが含まれていなかったとき、私は「ks is not defined」を言ってエラーを得ました。 私はksdepfuncsが含まれている場合、これはエラーになります:

Traceback (most recent call last):
  File "C:\Python26\Code\gppp.py", line 459, in <module>
    job_server.submit(reify, (pop1, pop2, 1000), depfuncs = (key_seq, ks, Chromosome, Params, Node, Tree), modules = ("math",), callback = sum.add, globals = globals())
  File "C:\Python26\lib\site-packages\pp.py", line 449, in submit
    sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
  File "C:\Python26\lib\site-packages\pp.py", line 634, in __dumpsfunc
    sources = [self.__get_source(func) for func in funcs]
  File "C:\Python26\lib\site-packages\pp.py", line 713, in __get_source
    sourcelines = inspect.getsourcelines(func)[0]
  File "C:\Python26\lib\inspect.py", line 678, in getsourcelines
    lines, lnum = findsource(object)
  File "C:\Python26\lib\inspect.py", line 519, in findsource
    file = getsourcefile(object) or getfile(object)
  File "C:\Python26\lib\inspect.py", line 441, in getsourcefile
    filename = getfile(object)
  File "C:\Python26\lib\inspect.py", line 418, in getfile
    raise TypeError('arg is not a module, class, method, '
TypeError: arg is not a module, class, method, function, traceback, frame, or code object

私はargksを参照しているかなり確信しています。だから、どこで.submit()についてksを教えていますか?私はどこに行くことになっているものを理解していません。おかげます。

役に立ちましたか?

解決

面白い - あなたは遺伝学シミュレーションをやっていますか?私はそこで「染色体」を見るので、私は聞いて、私は一度、並列のpythonを使用した集団遺伝学シミュレーションを開発します。

あなたのアプローチは本当に複雑に見えます。私の並列Pythonプログラムでは、私は次の呼び出しを使用します:

job = jobServer.submit( doRun, (param,))

どのように私はこれで逃げたのか?トリックはdoRun機能を使用すると、sumbit呼び出しているコンテキストと同じコンテキストで実行されないということです。例えば(不自然な例)

import os, pp

def doRun(param):
    print "your name is %s!" % os.getlogin()

jobServer = pp.Server()
jobServer.submit( doRun, (param,))

このコードは失敗します。 doRunが提出と同じコンテキストで実行されていない - osモジュールはdoRunに存在しないためです。必ず、あなたはosmoduleパラメータでsubmitを渡すことができますが、それだけでdoRunでimport osを呼び出すことが容易ではないのですか?

並列Pythonは完全に別のプロセスであなたの関数を実行することで、PythonのGILを回避しようとしています。それは、この簡単にはあなたの関数に「合格」のパラメータと名前空間をquote-せるが、それはこのハックを使用しないで飲み込むことにしよう。例えば、あなたのクラスはpickleのいくつかの変種を使用して直列化され、その後、新しいプロセスでアンシリアライズます。

しかし、その代わりにsubmitのハックに頼るの、ちょうどあなたの関数は、それがコンテキストを実行しています設定のすべての作業を行う必要があるとしている現実を受け入れます。あなたが実際にあなたがする必要がある仕事を設定main、経由で呼び出すsubmitする呼を設定1、および1つ、 - あなたは本当に2つのsubmit機能を持っています。

あなたはジェネレータから次の値がPPの実行のために利用できるようにする必要がある場合は、

、また、それをパラメータとして渡します!これは、ラムダ関数とジェネレータの参照を回避し、単純な変数を渡すことであなたを残します!

私のコードはもう維持していますが、興味があれば、ここでそれをチェックアウトされていません。 ます。http://pps-spud.uchicago。 EDU /のViewVC / FPS /トランク/パイソン/ fps.py?ビュー=マークアップする

他のヒント

私はあなたがラムダに渡すべきだと思う:ks.next()の代わりに、昔ながらのKSの

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top