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