python - Python 多处理:提取结果
问题描述
我正在尝试在 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 显然会改变默认行为(如果不这样做,它只会在单个核心上运行)。
我认为代码大部分都有效;每个过程都按预期执行模拟和拟合,但我不知道如何提取结果。就像现在一样,run_child 方法中的 queue.put(fit) 似乎导致程序停止。
关于为什么会发生这种情况以及如何解决它的任何想法?
解决方案
问题是试图将 OptimizeResult 数据类型传递给队列。只从合身中提取必要的数据并传递,反而像一个魅力。
感谢 Pierre-Nicolas Piquin 帮助解决这个问题!
推荐阅读
- python - “OSError:[Errno 24] 打开的文件太多:”带有来自 aiocoap context.request() 的套接字
- reactjs - Redux-observable:如何等待多个异步请求然后在史诗中执行操作
- r - 将矩阵的每 n 行移动到 R 中的新列
- angular - 如果未输入任何内容,则将默认值设置为反应控制
- python-3.x - Couchbase 安装失败(Windows)
- python-3.x - 在 numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs) 中传递一个列表作为 func1d 的参数
- r - 基于R中两列的索引/匹配,有可能吗?
- python - TF.RECORDS 图像 TensorFlow
- r - 反应函数在闪亮的 ggplot 中不起作用。情节是空白的
- scala - 无法使用 IntelliJ 在本地连接到 hdfs kerberized 集群