L > M の場合、L 個のコアを持つマシンで N 個の独立したタスクを正確に M 個のプロセッサに分散する方法を知りたいです。I/O を利用できるようにしたいので、すべてのプロセッサを使用したくありません。私が試した解決策は、すべてのプロセッサに分散され、システムが動かなくなったようです。
マルチプロセッシング モジュールが最適だと思います。
数値シミュレーションをしています。私のバックグラウンドはコンピュータ サイエンスではなく物理学なので、残念ながら、サーバー/クライアント、プロデューサー/コンシューマーなどの標準的なタスク モデルに関する議論を完全には理解していないことがよくあります。
私が試したいくつかの単純化されたモデルを次に示します。
シミュレーションを実行する関数run_sim(**kwargs)
(以下を参照) と、シミュレーション用の kwargs の長いリストがあり、8 コアのマシンがあるとします。
from multiprocessing import Pool, Process
#using pool
p = Pool(4)
p.map(run_sim, kwargs)
# using process
number_of_live_jobs=0
all_jobs=[]
sim_index=0
while sim_index < len(kwargs)+1:
number_of_live_jobs = len([1 for job in all_jobs if job.is_alive()])
if number_of_live_jobs <= 4:
p = Process(target=run_sim, args=[], kwargs=kwargs[sim_index])
print "starting job", kwargs[sim_index]["data_file_name"]
print "number of live jobs: ", number_of_live_jobs
p.start()
p.join()
all_jobs.append(p)
sim_index += 1
プロセッサの使用率を「top」、「1」の順で見ると、どちらの場合でもすべてのプロセッサが使用されているようです。「top」の出力を誤解しているのは論外ではありませんが、run_simulation()
プロセッサを集中的に使用する場合、マシンはひどく動かなくなります。
仮説シミュレーションとデータ:
# simulation kwargs
numbers_of_steps = range(0,10000000, 1000000)
sigmas = [x for x in range(11)]
kwargs = []
for number_of_steps in numbers_of_steps:
for sigma in sigmas:
kwargs.append(
dict(
number_of_steps=number_of_steps,
sigma=sigma,
# why do I need to cast to int?
data_file_name="walk_steps=%i_sigma=%i" % (number_of_steps, sigma),
)
)
import random, time
random.seed(time.time())
# simulation of random walk
def run_sim(kwargs):
number_of_steps = kwargs["number_of_steps"]
sigma = kwargs["sigma"]
data_file_name = kwargs["data_file_name"]
data_file = open(data_file_name+".dat", "w")
current_position = 0
print "running simulation", data_file_name
for n in range(int(number_of_steps)+1):
data_file.write("step number %i position=%f\n" % (n, current_position))
random_step = random.gauss(0,sigma)
current_position += random_step
data_file.close()