Я пытаюсь запустить кучу симуляций в Python, поэтому я попытался реализовать его с помощью многопроцессорной обработки.
import numpy as np
import matplotlib.pyplot as plt
import multiprocessing as mp
import psutil
from Functions import hist, exp_fit, exponential
N = 100000 # Number of observations
tau = 13362.525 # decay rate to simulate
iterations = 1 # Number of iterations for each process
bin_size = 1*1e9 # in nanoseconds
def spawn(queue):
results = []
procs = list()
n_cpus = psutil.cpu_count()
for cpu in range(n_cpus):
affinity = [cpu]
d = dict(affinity=affinity)
p = mp.Process(target=run_child, args=[queue], kwargs=d)
p.start()
procs.append(p)
for p in procs:
results.append(queue.get)
p.join()
print('joined')
return results
def run_child(queue, affinity):
proc = psutil.Process() # get self pid
proc.cpu_affinity(affinity)
print(affinity)
np.random.seed()
for i in range(iterations):
time = np.sort(-np.log(np.random.uniform(size=N)) * tau) * 1e9
n, bins = hist(time, bin_size)
fit = exp_fit(n, bins, silent=True)
queue.put(fit)
if __name__ == '__main__':
output = mp.Queue()
plt.figure()
results = spawn(output)
bins = range(1000)
for fit in results:
plt.plot(bins, exponential(fit.params, bins), 'k-', alpha=0.1)
plt.show()
Моя попытка во многом вдохновлена этим ответом, который я нашел во времяПопытка найти решение самостоятельно, где сходство каждого процесса вручную устанавливается как numpy, по-видимому, меняет поведение по умолчанию (если оно не выполняется, оно работает только на одном ядре).
Я думаю, что код в основном работает;каждый процесс выполняет симуляцию и подходит по назначению, но я не могу понять, как извлечь результаты.Как и сейчас, queue.put (fit) в методе run_child, кажется, вызывает остановку программы.
Есть идеи, почему это происходит и как это исправить?