Python concurrent.futuresとProcessPoolExecutorは、タスクのスケジュールと監視のためのきれいなインタフェースを提供します。先物にもprovide .cancel()メソッド:Python:concurrent.futures取り消し可能にするには?
はキャンセル():コールをキャンセルしよう。呼び出しが現在実行されているであり、取り消すことができない場合このメソッドはFalseを返します。そうでない場合は呼び出しがキャンセルされ、メソッドはTrueを返します。
は残念ながらsimmilar question(に関するasyncio)でタスクを実行している答えの主張は、ドキュメントのこのスニップを使用してuncancelableですが、ドキュメントは、彼らが実行していて、uncancelableされている場合にのみ、それを言ういけません。
プロセスにmultiprocessing.Eventsを送信するとも自明のことはできません(multiprocess.Processのようにパラメータを介して、そうすることはRuntimeErrorを返す)
私は何をしようとしていますか?私は検索スペースを分割し、すべてのパーティションに対してタスクを実行したいと思います。しかし、それは1つのソリューションを持つだけで十分です。そのプロセスはCPUを大量に消費します。 ProcessPoolを使用して利益を相殺しない、これを実現する実際の快適な方法はありますか?
例:私はあなたの質問が面白い見つけ
from concurrent.futures import ProcessPoolExecutor, FIRST_COMPLETED, wait
# function that profits from partitioned search space
def m_run(partition):
for elem in partition:
if elem == 135135515:
return elem
return False
futures = []
# used to create the partitions
steps = 100000000
with ProcessPoolExecutor(max_workers=4) as pool:
for i in range(4):
# run 4 tasks with a partition, but only *one* solution is needed
partition = range(i*steps,(i+1)*steps)
futures.append(pool.submit(m_run, partition))
done, not_done = wait(futures, return_when=FIRST_COMPLETED)
for d in done:
print(d.result())
print("---")
for d in not_done:
# will return false for Cancel and Result for all futures
print("Cancel: "+str(d.cancel()))
print("Result: "+str(d.result()))
あなたはPARAMとしてそれを渡すのではなく、グローバル変数に 'Event'を設定しようとすることができ、http://stackoverflow.com/questions/1675766/how-to-combine-pool-map-withを参照してください-array-shared-memory-in-python-multiprocessing – niemmi
@niemmi tippに感謝します。おそらくこれを回避策として試してみましょう。別のモジュールへの呼び出しでうまく設計されていないからです。 – Ketzu