質問

次のコードは私にとって適切に機能していないようです。たとえば、次のコマンドを使用して、ネットワーク上の別のコンピューターで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回実行され、結果として結果を返します!

ある種の人種状態のようですか?ローカルコアを使用するだけで正常に機能します。これは、pp v 1.6.0および1.5.7を使用しています。

更新:約775,000,000:一貫性のない結果が得られます。2つのジョブが初めて終了します。

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

数ヶ月後の更新:残りの難しい感情はありません、パラレルパイソン。アプリケーションを移行する時間があるとすぐに戻る予定です。ソリューションを反映するタイトル編集。

役に立ちましたか?

解決

パラレルパイソンフォーラムのバギラからの回答:

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

たぶん、あなたの仕事は上記の変数の時間よりも時間がかかるでしょう。それの価値を上げて、試してみてください。

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

他のヒント

後ろにいくつかのノードが残りのタスクの長い尾が完了するため、ライブラリが複製を許可する可能性があります。タスクを複製することにより、遅いノードをバイパスでき、最初に終了する結果を取る必要があります。各タスクに一意のIDを含めることでこれを回避でき、それぞれに対して最初に返すもののみを受け入れることができます。

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