簡體   English   中英

Python 多處理:提取結果

[英]Python multiprocessing: Extracting results

我試圖在 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 幫助解決它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM