2

次のコードは私には正しく機能していないようです。たとえば、次のコマンドを使用して、ネットワーク上の別のコンピューターでppserverを起動する必要があります。

ppserver.py -r -a -w 4

このサーバーが起動したら、私のマシンで次のコードを実行します。

import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
    r = x
    for i in xrange(10**9):
        r+=1
    f = open('/home/tomb/statusfile.txt', 'a')
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
    return r

jobs = []
jobs.append(job_server.submit(addOneBillion, (1,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,), (), ("time",)))

for job in jobs:
    print job()
print 'done'

奇妙な部分:/home/tomb/statusfile.txtを見ると、関数が数回実行されているかのように、数回書き込まれていることがわかります。私はこれが1時間以上続くのを観察しましたが、job()戻ってくることはありませんでした。

Odder:testfunc定義の反復回数を10 ** 8に変更すると、関数は1回だけ実行され、期待どおりの結果が返されます。

ある種の競合状態のように見えますか?ローカルコアを使用するだけで問題なく動作します。これは、ppv1.6.0および1.5.7の場合です。

更新:約775,000,000:一貫性のない結果が得られます:2つのジョブが1回繰り返され、最初に終了します。

1週間後の更新:これを回避するために独自の並列処理モジュールを作成しました。誰かがこれを理解しない限り、将来的には並列pythonを回避します-もう少し詳しく見ていきます(実際にはソースに飛び込みます)コード)ある時点で。

数か月後の更新:残りのハードな感情はありません、ParallelPython。アプリケーションを移行する時間があるとすぐに戻る予定です。ソリューションを反映するためのタイトル編集。

4

2 に答える 2

2

Parallel Python フォーラムの Bagira からの回答:

各ジョブの計算にはどのくらいの時間がかかりますか? TRANSPORT_SOCKET_TIMEOUT/usr/local/lib/python2.6/dist-packages/pptransport.pyの変数を見て ください。

おそらく、あなたの仕事は上記の変数の時間よりも長くかかります。値を大きくして試してみてください。

これがまさに問題だったことがわかりました。私のアプリケーションでは、数分かかるジョブのバッチ スケジューラとして PP を使用しているため、これを調整する必要があります。(デフォルトは 30 秒)

于 2011-01-11T16:06:04.903 に答える
1

一部のノードが遅れて完了するため、残りのタスクのロングテールが発生するため、ライブラリが重複を許可している可能性があります。タスクを複製することで、遅いノードをバイパスでき、最初に終了した結果だけを取得する必要があります。これを回避するには、各タスクに一意の ID を含め、それぞれに対して返される最初の ID のみを受け入れます。

于 2010-11-17T15:45:17.140 に答える