首頁 >後端開發 >Python教學 >如何在 Python 中實現並行性:釋放多核心能力?

如何在 Python 中實現並行性:釋放多核心能力?

DDD
DDD原創
2024-10-22 20:05:01981瀏覽

How to Implement Parallelism in Python: Unleashing Multi-Core Power?

問題:在 Python 中擁抱並行

在 C 語言中,OpenMP 為平行程式設計提供了強大的支援。然而Python缺少這個方便的工具。我們如何在Python程式中實現並行性,特別是在獨立函數需要並行化的場景中?

考慮以下程式碼結構:

<code class="python">solve1(A)
solve2(B)</code>

其中solve1和solve2是獨立函數。目的是並行執行此程式碼,最大限度地減少執行時間。

讓我們來探索一下提供的程式碼片段:

<code class="python">def solve(Q, G, n):
    i = 0
    tol = 10 ** -4

    while i < 1000:
        inneropt, partition, x = setinner(Q, G, n)
        outeropt = setouter(Q, G, n)

        if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
            break
            
        node1 = partition[0]
        node2 = partition[1]
    
        G = updateGraph(G, node1, node2)

        if i == 999:
            print "Maximum iteration reaches"
    print inneropt</code>

我們的目標是並行化 setinner 和 setouter 函數。

答案:透過多處理模組釋放並行能力

多處理模組為 Python 中的平行程式設計提供了強大的解決方案。它允許我們產生多個可以同時執行任務的進程,並利用多個 CPU 核心的處理能力。

對於提供的程式碼,可以使用處理池。其實作方式如下:

<code class="python">from multiprocessing import Pool

pool = Pool()
result1 = pool.apply_async(solve1, [A])    # evaluate "solve1(A)" asynchronously
result2 = pool.apply_async(solve2, [B])    # evaluate "solve2(B)" asynchronously
answer1 = result1.get(timeout=10)
answer2 = result2.get(timeout=10)</code>

此程式碼片段建立一個進程池,該進程池將非同步執行solve1 和solve2 函數。每個CPU核心可以同時執行一個進程,有效減少執行時間。

另一種方法並行化任務的方法是使用map函數:

<code class="python">args = [A, B]
results = pool.map(solve1, args)</code>

這種方法將solve1函數應用於args 列表中的每個元素都是並行的。

但是,需要注意的是,執行緒不應該用於 Python 中的平行程式設計。這是因為 GIL(全域解釋器鎖定)阻止多個執行緒同時執行 Python 字節碼,從本質上否定了並行性的任何潛在好處。

以上是如何在 Python 中實現並行性:釋放多核心能力?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn