공유 클러스터에서 작업 중입니다. 나는 이 클러스터에서 병렬화된 C 코드를 실행하는 사람들을 본 적이 있으며, top
실행 중인 프로세스를 살펴보면 CPU의 400%를 사용하는 것으로 나타났습니다. 왜냐하면 그들은 코드의 단일 인스턴스에 4개의 프로세서를 사용하고 있었기 때문입니다.
지금 누군가가 (내가 아는 한) 병렬화된 Python 코드를 실행하고 있습니다. 그러나 Python 코드는 top
CPU의 400%를 사용하는 것으로 보이지 않고 오히려 각각 자체 프로세서(100%)를 사용하는 4개의 서로 다른 프로세스로 나타납니다.
top
Python(병렬화될 때) 이 C와 달리 여러 다른 프로세스로 실행되는 것처럼 보이는지, 아니면 이 Python 코드가 실제로 병렬로 실행되지 않는지 궁금합니다 .
이 문제를 해결하기 위해 Stack Exchange가 더 좋은 곳인지는 모르겠습니다. 이용하고 있으니 top
여기가 더 좋을 것 같다는 생각이 들었습니다. 옮겨야 하는지 알려주세요.
답변1
C에서 볼 수 있는 것은 스레드의 사용량이므로 프로세스 사용량은 모든 스레드의 합계입니다. 4개의 스레드가 있고 각 스레드의 CPU 사용량이 100%인 경우 프로세스는 400%로 표시됩니다.
Python에서 볼 수 있는 것은 다중 프로세스 모델을 통해 달성된 병렬성임이 거의 확실합니다. 이는 Python의 스레딩 한계를 극복하기 위해 설계된 모델입니다. Python은 한 번에 하나의 스레드만 실행할 수 있습니다(Python 전역 해석기 잠금 - GIL 참조). 더 나은 결과를 얻으려면 ps에서 여러 프로세스로 표시되는 스레드 대신 프로세스를 생성하는 다중 프로세스 모듈을 사용할 수 있습니다. 그런 다음 각 프로세스는 모두 단일 프로세스 스레드이므로 CPU의 최대 100%를 사용할 수 있습니다.
실행하면 ps -afeT
C 프로그램의 스레드는 표시되지만 Python 프로그램의 다른 스레드는 표시되지 않습니다.
답변2
참조 Python 구현 CPython에는 GIL(Global Interpreter Lock)이 있어 다음 환경에서 코드를 실행하는 것을 방지합니다.평행선, 오직동시에. 스레드는 I/O에만 유용합니다. 병렬로 실행하려면 여러 프로세스가 필요합니다. 당신이 보고 있는 C 코드는 병렬성을 달성하기 위해 스레드를 사용할 가능성이 높습니다.