6

これは、parallel-python タグを使用した 2 番目の質問にすぎません。ドキュメントに目を通し、主題をグーグルで検索した後、回答と提案で最高の幸運が得られた場所であるため、ここに来ました。

以下は、すべての関連情報を pp.

    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()

ksで定義されていglobals()ます。他のどこにも含めなかった場合、「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

argを参照していると確信していksます。では、どこ.submit()について話しksますか?何がどこにあるのかわかりません。ありがとう。

4

2 に答える 2

5

興味深い - 遺伝学シミュレーションを行っていますか? そこに「染色体」が表示されているので質問します。以前、並列 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,))

このコードは失敗します。これは、os モジュールが doRun に存在しないためです。doRun は送信と同じコンテキストで実行されていません。osもちろん、のmoduleパラメータを渡すこともできますが、 doRun でsubmit呼び出すだけの方が簡単ではありませんか?import os

parallel python は、関数を完全に別のプロセスで実行することにより、python の GIL を回避しようとします。関数にパラメーターと名前空間を引用符で「渡す」ことで、これを飲み込みやすくしようとしますが、ハックを使用してこれを行います。たとえば、クラスは のバリアントを使用してシリアライズさpickleれ、新しいプロセスでシリアライズ解除されます。

しかし、 のハックに頼る代わりにsubmit、関数が実行コンテキストを設定するすべての作業を行う必要があるという現実を受け入れてください。実際には 2 つのmain関数がsubmitありsubmitます。

ジェネレーターからの次の値を pp の実行に使用できるようにする必要がある場合は、それもパラメーターとして渡します! これにより、ラムダ関数とジェネレータ参照が回避され、単純な変数を渡すだけになります!

私のコードはもうメンテナンスされていませんが、興味があればこちらをチェックしてください: http://pps-spud.uchicago.edu/viewvc/fps/trunk/python/fps.py?view=markup

于 2009-10-10T10:23:51.020 に答える