簡體   English   中英

Python 多處理產生不穩定的結果

[英]Python multiprocessing producing unstable results

誰能幫我理解為什么這個嘗試使用python的multiprocessing模塊加速for循環的簡單示例會產生不穩定的結果? 我使用Manager.List來存儲來自子進程的值。

顯然,我至少做錯了一件事。 這樣做的正確方法是什么?

import numpy as np
import multiprocessing
from matplotlib import pyplot as plt

from functools import partial
from multiprocessing import Manager


def run_parallel(x_val, result):

    val = np.arctan(x_val)

    result.append(val)


def my_func(x_array, parallel=False):

    if not parallel:
        result = []
        for k in x_array:
            result.append(np.arctan(k))

        return result

    else:
        manager = Manager()
        m_result = manager.list()

        pool = multiprocessing.Pool(4)
        pool.map(partial(run_parallel, result=m_result), x_array)

        return list(m_result)


test_x = np.linspace(0.1,1,50)
serial = my_func(test_x,parallel=False)
parallel = my_func(test_x,parallel=True)

plt.figure()
plt.plot(test_x, serial, label='serial')
plt.plot(test_x,parallel, label='parallel')
plt.legend(loc='best')
plt.show()

我得到的 output 看起來像這樣

這個

每次運行時它看起來都不一樣。

我添加了一些打印函數,結果發現 x_array 中元素的順序是任意的……這就是它看起來如此奇怪的原因。 我認為您應該保留arctan對的參數和值,然后按參數值對其進行排序

編輯

我讀了更多,結果發現map按順序返回值...這可以按您的意願工作:

import numpy as np
import multiprocessing
from matplotlib import pyplot as plt

from functools import partial
from multiprocessing import Manager


def run_parallel(x_val, result):

    val = np.arctan(x_val)
    return val


def my_func(x_array, parallel=False):
    if not parallel:
        result = []
        for k in x_array:
            result.append(np.arctan(k))

        return result

    else:
        manager = Manager()
        m_result = manager.list()

        pool = multiprocessing.Pool(4)
        x = pool.map(partial(run_parallel, result=m_result), x_array)
        return list(x)


test_x = np.linspace(0.1,1,50)
parallel = my_func(test_x,parallel=True)

plt.figure()
plt.plot(test_x,parallel, label='parallel')
plt.legend(loc='best')
plt.show()

暫無
暫無

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

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