프로세스 클래스에 인스턴스를 만든 후에는 프로세스 만 시작하면됩니다. 이것은 p.start ()를 작성하여 수행됩니다. 이 시점에서 프로세스가 시작됩니다.
우리가 종료하기 전에, 우리는 아동 과정이 계산을 완료 할 때까지 기다려야합니다. join () 메소드는 프로세스가 종료 될 때까지 기다립니다이 예에서는 하나의 아동 프로세스 만 만들었습니다. 당신이 추측 할 수 있듯이, 우리는 프로세스 클래스에서 더 많은 인스턴스를 만들어 더 많은 어린이 프로세스를 만들 수 있습니다. .
풀 클래스
더 많은 CPU 집약적 인 작업을 처리하기 위해 여러 프로세스를 만들어야한다면 어떻게해야합니까? 우리는 항상 종료를 명시 적으로 시작하고 기다려야합니까? 여기서 해결책은 풀 클래스를 사용하는 것입니다.
풀 클래스를 사용하면 작업자 프로세스 풀을 만들 수 있으며 다음 예에서는 어떻게 사용할 수 있는지 살펴 봅니다. 이것이 우리의 새로운 예입니다 :
이 코드 스 니펫에는 정수를 가져 와서 제곱근을 반환하는 큐브 (x) 함수가 있습니다. 쉬운, 맞습니까?
그런 다음 속성을 지정하지 않고 풀 클래스의 인스턴스를 만듭니다. 풀 클래스는 기본적으로 CPU 코어 당 하나의 프로세스를 만듭니다. 다음으로, 우리는 몇 가지 인수로 맵 메소드를 실행합니다.
맵 메소드는 우리가 제공하는 반복 가능한 모든 요소에 큐브 함수를 적용합니다.이 경우 10에서 N의 모든 숫자 목록입니다.
이것의 큰 장점은 목록의 계산이 병렬로 이루어진다는 것입니다!
파이썬 멀티 프로세싱을 가장 잘 활용하는
여러 프로세스를 생성하고 병렬 계산을 수행하는 것이 직렬 컴퓨팅보다 반드시 더 효율적인 것은 아닙니다. 낮은 CPU 집약적 인 작업의 경우 직렬 계산이 병렬 계산보다 빠릅니다. 이러한 이유로, 당신이 수행하는 작업에 따라 다중 프로세싱을 사용해야하는시기를 이해하는 것이 중요합니다.
이것을 설득하려면 간단한 예를 살펴 보겠습니다.
이 스 니펫은 이전 예제를 기반으로합니다. 우리는 같은 문제를 해결하고 있는데,이 문제는 n 숫자의 제곱근을 계산하지만 두 가지 방법으로 계산합니다. 첫 번째는 Python Multiprocessing 사용과 관련이 있지만 두 번째는 그렇지 않습니다. 시간 라이브러리에서 Perf_counter () 메소드를 사용하여 시간 성능을 측정하고 있습니다.
내 노트북에서, 나는이 결과를 얻는다 :
보시다시피, 1 초 이상의 차이가 있습니다. 따라서이 경우 다중 프로세싱이 더 좋습니다.
N의 값과 같이 코드에서 무언가를 변경합시다.
이것은 내가 지금 얻는 것입니다 :
<span>from multiprocessing import Process
</span>
<span>def bubble_sort(array):
</span> check <span>= True
</span> <span>while check == True:
</span> check <span>= False
</span> <span>for i in range(0, len(array)-1):
</span> <span>if array[i] > array[i+1]:
</span> check <span>= True
</span> temp <span>= array[i]
</span> array<span>[i] = array[i+1]
</span> array<span>[i+1] = temp
</span> <span>print("Array sorted: ", array)
</span>
<span>if __name__ == '__main__':
</span> p <span>= Process(target=bubble_sort, args=([1,9,4,5,2,6,8,4],))
</span> p<span>.start()
</span> p<span>.join()
</span>
무슨 일이야? 멀티 프로세싱은 이제 나쁜 선택 인 것 같습니다. 왜? <.>
프로세스 간 계산을 분할하여 도입 된 오버 헤드는 해결 된 작업과 비교할 때 너무 많습니다. 시간 성능 측면에서 얼마나 많은 차이가 있는지 알 수 있습니다.
결론
이 기사에서는 Python Multiprocessing을 사용하여 Python 코드의 성능 최적화에 대해 이야기했습니다. 먼저, 우리는 병렬 컴퓨팅이 무엇인지 간략하게 소개했으며 그것을 사용하기위한 주요 모델을 소개했습니다. 그런 다음 멀티 프로세싱과 장점에 대해 이야기하기 시작했습니다. 결국, 우리는 계산을 병렬화하는 것이 항상 최선의 선택이 아니며 멀티 프로세싱 모듈은 CPU 결합 작업을 병렬화하는 데 사용해야한다는 것을 알았습니다. 항상 그렇듯이, 그것은 당신이 직면하고있는 특정 문제를 고려하고 다른 솔루션의 장단점을 평가하는 문제입니다. .
나는 당신이 내가했던 것처럼 유용한 파이썬 멀티 프로세싱에 대해 배우기를 바랍니다.
Python Multiprocessing 및 병렬 프로그래밍 에 대한 FAQ
파이썬에서 멀티 프로세싱을 사용하는 데있어 주요 장점은 무엇입니까?
파이썬에서 멀티 프로세싱을 사용하는 주요 장점은 여러 프로세스를 동시에 실행할 수 있다는 것입니다. 이는 프로그램이 CPU의 여러 코어를 활용하여 프로그램의 속도와 효율성을 크게 향상시킬 수 있으므로 CPU 집약적 인 작업을 수행 할 때 특히 유익합니다. 스레딩과 달리 멀티 프로세싱은 Python의 GIL (Global Interpreter Lock)으로 어려움을 겪지 않으므로 각 프로세스는 다른 프로세스의 영향을받지 않고 독립적으로 실행될 수 있음을 의미합니다. 이것은 멀티 프로세싱이 Python에서 병렬 프로그래밍을위한 강력한 도구를 만듭니다. Python의 멀티 프로세싱 모듈은 어떻게 작동합니까?
Python의 멀티 프로세싱 모듈은 각 작업에 대한 새로운 프로세스를 만들어 작동합니다. 동시에 실행됩니다. 각 프로세스에는 고유 한 Python 통역사 및 메모리 공간이있어 다른 프로세스와 독립적으로 실행될 수 있습니다. 멀티 프로세싱 모듈은 이러한 프로세스를 쉽게 만들고 관리 할 수있는 여러 클래스와 기능을 제공합니다. 예를 들어, 프로세스 클래스는 새 프로세스를 만드는 데 사용되는 반면 풀 클래스는 작업자 프로세스 풀을 관리하는 데 사용됩니다. 파이썬의 멀티 프로세싱과 멀티 스레딩의 차이점은 무엇입니까?
파이썬에서 멀티 프로세싱과 멀티 스레딩의 주요 차이점은 작업을 처리하는 방법에 있습니다. 멀티 프로세싱은 각 작업마다 새로운 프로세스를 생성하지만 MultithReading은 동일한 프로세스 내에서 새 스레드를 만듭니다. 이는 멀티 프로세싱이 여러 CPU 코어를 최대한 활용할 수 있지만, 멀티 스레딩은 Python의 GIL (Global Interpreter Lock)에 의해 제한되므로 한 번에 하나의 스레드 만 실행할 수 있습니다. 그러나 멀티 스레딩은 여전히 입력/출력 작업이 완료되기를 기다리는 I/O 바운드 작업에 여전히 유용 할 수 있습니다. 파이썬의 프로세스간에 데이터를 공유하려면 어떻게 할 수 있습니까? 파이썬의 프로세스 간 데이터 공유는 멀티 프로세싱 모듈의 공유 메모리 메커니즘을 사용하여 달성 할 수 있습니다. 여기에는 값 및 배열 클래스가 포함되며, 이는 각각 공유 변수 및 배열을 생성 할 수 있습니다. 그러나 각 프로세스에는 자체 메모리 공간이 있으므로 한 프로세스의 공유 변수 또는 배열에 대한 변경 사항이 잠금 장치 또는 다중 프로세스 모듈에 의해 제공되는 기타 동기화 프리미티브를 사용하여 명시 적으로 동기화되지 않는 한 다른 프로세스에 반영되지 않습니다.
파이썬에서 멀티 프로세싱을 사용하는 잠재적 인 함정은 무엇입니까?
Python에서 멀티 프로세싱하는 동안 프로그램의 속도와 효율성을 크게 향상시킬 수 있으며 자체 도전 과제도 제공됩니다. 주요 함정 중 하나는 코드의 복잡성이 증가한다는 것입니다. 여러 프로세스를 관리하는 것은 특히 공유 데이터를 처리하고 프로세스를 동기화 할 때 단일 스레드 프로그램을 관리하는 것보다 더 복잡 할 수 있습니다. 또한 새로운 프로세스를 작성하는 것은 새로운 스레드를 만드는 것보다 리소스 집약적이므로 메모리 사용이 증가 할 수 있습니다. 마지막으로, 모든 작업이 병렬화에 적합한 것은 아니며, 경우에 따라 여러 프로세스를 작성하고 관리하는 오버 헤드가 잠재적 성능 이득을 능가 할 수 있습니다.
Python에서의 다중 프로세싱의 예외를 어떻게 처리 할 수 있습니까?
파이썬에서 멀티 프로세싱의 처리 예외는 아동 프로세스에서 발생하는 예외가 부모 프로세스로 자동 전파되지 않기 때문에 약간 까다로울 수 있습니다. 그러나 멀티 프로세싱 모듈은 예외를 처리하는 몇 가지 방법을 제공합니다. 한 가지 방법은 프로세스 클래스의 is_alive () 메소드를 사용하여 프로세스가 여전히 실행 중인지 확인하는 것입니다. 메소드가 False를 반환하면 프로세스가 종료되었음을 의미하며 이는 예외로 인한 것일 수 있습니다. 또 다른 방법은 프로세스 클래스의 ExitCode 속성을 사용하는 것입니다. 프로세스가 종료 된 이유에 대한 자세한 정보를 제공 할 수 있습니다. 다른 Python 라이브러리와 함께 멀티 프로세싱을 사용할 수 있습니까? 예, 멀티 프로세스를 사용할 수 있습니다. 다른 파이썬 라이브러리. 그러나 모든 라이브러리가 멀티 프로세싱 환경에서 사용되도록 설계된 것은 아닙니다. 일부 라이브러리는 스레드 안전하지 않거나 동시 실행을 지원하지 않을 수 있습니다. 따라서, 멀티 프로세싱을 지원하는지 확인하기 위해 사용중인 라이브러리의 문서를 확인하는 것이 좋습니다. Python에서 멀티 프로세싱 프로그램을 디버깅 할 수있는 방법은 무엇입니까?
다중 프로세싱 환경에서 예상대로 작동하지 않을 수 있으므로 Python에서 멀티 프로세싱 프로그램을 디버깅하는 것은 어려울 수 있습니다. 그러나 프로그램을 디버깅하는 데 사용할 수있는 몇 가지 기술이 있습니다. 한 가지 방법은 인쇄 문 또는 로깅을 사용하여 프로그램 실행을 추적하는 것입니다. 또 다른 방법은 PDB 모듈의 set_trace () 함수를 사용하여 코드에서 중단 점을 설정하는 것입니다. 멀티 프로세싱 모듈의 log_to_stderr () 함수와 같은 멀티 프로세싱을 지원하는 특수 디버깅 도구를 사용하여 프로세스의 활동을 표준 오류에 기록 할 수 있습니다. 운영 체제? 예, 다른 운영 체제에서 파이썬에서 멀티 프로세싱을 사용할 수 있습니다. 멀티 프로세싱 모듈은 표준 Python 라이브러리의 일부이므로 Python을 지원하는 모든 플랫폼에서 사용할 수 있습니다. 그러나 다중 프로세싱 모듈의 동작은 프로세스를 처리하는 방식의 차이로 인해 운영 체제마다 약간 달라질 수 있습니다. 따라서 대상 운영 체제에서 프로그램이 예상대로 작동하는지 확인하는 것이 항상 좋은 생각입니다. Python에서 멀티 프로세싱을 사용하기위한 몇 가지 모범 사례는 무엇입니까?
일부 모범 사례에 대한 모범 사례는 무엇입니까? 파이썬에서 멀티 프로세싱 사용은 다음과 같습니다. - 가능할 때마다 프로세스간에 데이터를 공유하지 않으면 복잡한 동기화 문제가 발생할 수 있으므로 풀 클래스를 사용하여 작업자를 관리합니다. 프로세스는 프로세스를 작성하고 관리하는 프로세스를 단순화하는 더 높은 수준의 인터페이스를 제공하므로 프로세스 클래스의 join () 메소드를 호출하여 프로세스를 계속 정리하여 프로세스가 계속되기 전에 프로세스가 완료되도록합니다. . - 프로그램이 예기치 않게 충돌하지 않도록 예외를 올바르게 처리하십시오.
- 프로그램이 멀티 프로세싱 환경에서 올바르게 작동하는지 확인하기 위해 프로그램을 철저히 테스트하십시오. .