3

私は進化的計算の問題に取り組んでおり、それを優れたECSPYモジュールで実装しています。私が使用している適応度の値は、かなり複雑なダイナミクスシミュレーションから導き出されています。シミュレーションを防爆にするというアプローチは好きではありません。進化の過程で、simuエンジンが解決できるように構築されていない状況が発生する可能性があるため、これはかなり役に立ちません。ただし、解決可能なシーンを返すようにジェネレータを制約することは、物事を制約することを超えています。

したがって、私のアプローチは単純です。シミュレーションに時間がかかりすぎたり、クラッシュしたりした場合は、ダーウィンの慈悲に任せます

マルチプロセッシングモジュールを使用して、候補者の適性を評価しています。segfaultingインタープリターをキャッチしたり、数秒で殺したりするにはどうすればよいですか?

よろしくお願いします。

-jf

4

1 に答える 1

3

subprocessPythonスクリプト内にPythonインタープリターを「ラップ」するために使用します。

  • あなたのものを実行するPythonインタープリターを起動します。

  • 時計を開始します。

  • クロックがなくなるか、子プロセスがクラッシュするまで待ちます。

これを行う簡単で怠惰な方法は、サブプロセスを定期的にポーリングして、まだ停止しているかどうかを確認することです。はい、それは「ビジーウェイト」ですが、サブプロセスの終了時に即座に通知したくない場合は、実装が簡単で、リソースコストが比較的低くなります。

import subprocess
import time
timeout = # your timeout interval
real_work= subprocess.Popen( "python the_real_work.py" )
start= time.time()
status= real_work.poll()
while time.time()-start < timeout and not status:
    time.sleep( 10.0 )
    status= real_work.poll()
if not status: 
    real_work.kill()

そのような何かがうまくいくかもしれません。タイムアウト間隔でたまたま終了した場合、競合状態になります。キルは失敗する可能性があります。

于 2011-07-22T15:54:31.550 に答える