>백엔드 개발 >파이썬 튜토리얼 >Python에서 병렬성을 구현하는 방법: 멀티 코어 성능 활용?

Python에서 병렬성을 구현하는 방법: 멀티 코어 성능 활용?

DDD
DDD원래의
2024-10-22 20:05:01972검색

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

질문: Python에서 병렬 처리 수용

C에서 OpenMP는 병렬 프로그래밍을 강력하게 지원합니다. 그러나 Python에는 이러한 편리한 도구가 없습니다. Python 프로그램에서, 특히 독립 함수에 병렬화가 필요한 시나리오에서 어떻게 병렬성을 달성할 수 있나요?

다음 코드 구조를 고려하세요.

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

solv1과solv2가 독립 함수인 경우. 목표는 이 코드를 병렬로 실행하여 실행 시간을 최소화하는 것입니다.

제공된 코드 조각을 살펴보겠습니다.

<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>

이 코드 조각은solv1 및solv2 함수를 비동기적으로 실행하는 프로세스 풀을 생성합니다. 각 CPU 코어는 하나의 프로세스를 동시에 실행하여 실행 시간을 효과적으로 줄일 수 있습니다.

작업을 병렬화하는 또 다른 방법은 맵 기능을 사용하는 것입니다.

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

이 접근 방식은solv1 기능을 다음에 적용합니다. args 목록의 각 요소는 병렬로 실행됩니다.

그러나 Python의 병렬 프로그래밍에는 스레드를 사용해서는 안 된다는 점에 유의하는 것이 중요합니다. 이는 GIL(Global Interpreter Lock)이 여러 스레드가 Python 바이트 코드를 동시에 실행하는 것을 방지하여 본질적으로 병렬 처리의 잠재적 이점을 무효화하기 때문입니다.

위 내용은 Python에서 병렬성을 구현하는 방법: 멀티 코어 성능 활용?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.