私はグローバル最適を見つける機会を増やすために、いくつかの異なる初期条件を使用する最適化アルゴリズムを書いています。マルチプロセッシングライブラリを使用してコードを高速化し、さまざまなプロセスで最適化を実行するようにしています。ネストされたオブジェクトを使用するPythonマルチプロセッシング
これは私のコードは基本的に今取り組んでいる方法です。
from multiprocessing import Process, Queue
from SupportCostModel.SupportStructure import SupportStructure, SupportType
# Method the processes will execute
def optimizeAlgoritm(optimizeObject, qOut):
optimizeObject.Optimize()
qOut.put(optimizeObject)
# Method the main thread will execute
def getOptimumalObject(n):
for i in range(n):
# Create a new process with a new nested object that should be optimized
p = Process(target = optimizeAlgoritm, args = (SupportStructure(SupportType.Monopile), qOut))
processes.append(p)
p.deamon = True
p.start()
# Part the main thread is running
if __name__ == '__main__':
qOut = Queue()
processes = []
# Run the code on 6 processes
getOptimumalObject(6)
for i in range(len(processes)):
processes[i].join()
# Get the best optimized object and print the resulting value
minimum = 1000000000000000000000000.
while not qOut.empty():
optimizeObject = qOut.get()
if optimizeObject.GetTotalMass() < minimum:
bestObject = optimizeObject
minumum = optimizeObject.GetTotalMass()
print(bestObject.GetTotalMass())
このコードは、限り、私は唯一の4つのプロセスを使用して動作します。この例のように4を超えるコードを実行すると、コードの最後に2つのプロセスが停止し、メインスレッドが依然としてprocesses[i].join()
になっているため、コードは実行を停止しません。私は2つのプロセスがのoptimizeAlgorithmに問題があると思います。 qOut.put()
を削除すると、コードが終了し、bestObjectが存在しないというエラーが発生します。しかし、奇妙なことは、例えば、印刷すると、オブジェクトがqOut.put()
の後に最低限必要であるということです。しかし、プロセスは私のCPUの0%を使って生き続けるでしょう。これにより、メインコードも強制的に生き残ります。
私は、マルチプロセッシングとOOPとマルチプロセッシングがいつもうまく連携しているわけではないことを読んだことで、かなり新しいです。ここで間違ったアプローチをしていますか?それはほとんど動作しますが、4つ以上のプロセスでは動作しません。
ありがとうございます!
さて、あなたの現在の例では、実行することはできません。構文エラーがあります。さらに悪いことに、メインコードの 'processes'へのアクセス権がありません。これは関数呼び出しでしか定義されていないからです。それを修正して問題を解決できるようにしてください – JohanL
申し訳ありませんが、私はここにコードを書いていますので、実際にはいくつかの構文エラーがありました。私はそれを編集して削除した。私のネストされたオブジェクトは、ここに入れることが複雑です。私のコードの基本的な考え方はこのように正しいのですか? –
端末からコードを実行しようとしましたか?私はPycharm対話型コンソールでマルチプロセスを実行しているときに同様の問題を抱えていました。投稿したコードには他にも目に見える問題がいくつかありますが、それはちょうどミスタイプであると思います。 – gionni