여러 코어에서 파이썬으로 CPU 집중 프로그램을 실행하고 C 확장을 작성하는 방법을 파악하려고합니다. 이것에 코드 샘플이나 튜토리얼이 있습니까?파이썬에서 C 확장을 사용하여 GIL을 둘러 보는 방법
답변
mpi4py과 같은 python mpi 라이브러리 중 하나를 사용하셨습니까? MPI는 일반적으로 클러스터를 통해 작업을 배포하는 데 사용되지만 단일 멀티 코어 시스템에서는 상당히 잘 작동합니다. 단점은 MPI의 통신 호출을 쉽게 사용할 수 있도록 코드를 리팩터링해야한다는 것입니다.
multiprocessing을 살펴보십시오. 데이터를 전 세계적으로 공유하지 않고 단일 프로세스에 많은 쓰레드를 쏟아 부은 것이 아니라 운영 체제가 선호하는 것이 종종 간과되는 사실입니다.
CPU 집약적 인 동작에 스레딩이 필요하다고 계속 주장하는 경우 working with the GIL in C에 대한 설명서를 살펴보십시오. 그것은 꽤 유익합니다.
이미 파이썬 프로그램을 여러 프로세스로 나눌 수 있습니다. OS는 이미 모든 코어에 프로세스를 할당합니다.
이렇게하십시오.
python part1.py | python part2.py | python part3.py | ... etc.
OS는 해당 파트가 최대한 많은 리소스를 사용하도록합니다. sys.stdin
및 sys.stdout
에 cPickle
을 사용하여이 파이프 라인을 따라 정보를 쉽게 전달할 수 있습니다.
너무 많은 노력을 기울이지 않으면 종종 극적인 속도 향상을 가져올 수 있습니다.
예 - haterz에게 - 고문을당하는 알고리즘을 구성하여 속도를 크게 높일 수는 없습니다. 그러나 이것은 종종 최소한의 작업으로 큰 이익을 가져옵니다.
그리고.
이 목적을위한 구조 조정은 스레드 동시성을 최대화하기 위해 필요한 재구성과 일치합니다. 정확히입니다. 그래서. 더 많은 데이터 공유가 도움이된다는 것을 입증 할 수있을 때까지 비공유 프로세스 병렬 처리로 시작한 다음 더 복잡한 공유 - 모든 스레드 병렬 처리로 이동하십시오.
이것은 C 확장을 유용하게 사용합니다. 검색해야하는 키워드는 Py_BEGIN_ALLOW_THREADS
입니다.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
P.S. 내 말은 처리가 이미 C로되어 있고 이미징 처리와 같은 경우 C 확장의 잠금을 해제하는 것이 좋습니다. 처리 코드가 주로 파이썬 인 경우 multiprocessing
에 대한 다른 사람들의 제안이 더 좋습니다. 일반적으로 백그라운드 처리를 위해 C로 코드를 다시 작성하는 것은 정당하지 않습니다.
다중 처리가 쉽습니다. 그게 충분히 빠르지 않다면, 당신의 질문은 복잡합니다.
멀티 프로세싱 대 스레딩을 사용하려고 할 때 가장 큰 문제는 1000+ 스레드 (프로세스)를 실행하려고 할 때 각 스레드마다 파이썬 인터프리터의 별도 인스턴스를 얻는 것입니다. 이것은 메모리 측면에서 극도로 비쌉니다. – Andy
@nalroff : 맞지 않습니다. 대부분의 인터프리터에 사용되는 메모리는 해당 인터프리터의 모든 인스턴스에서 공유됩니다. 다른 페이지 만 총 메모리 사용량을 늘립니다. 올바른 가치를 찾고 있는지 확인하십시오.또한 프로세스가 추가 스레드보다 훨씬 더 많은 메모리를 사용하지 않는다는 점도 주목할 가치가 있습니다. –
파이썬에서 멀티 프로세싱 모듈을 사용할 때마다 항상 프로세스와 스레드 간의 메모리 사용량이 크게 달라졌습니다. 어쨌든 스레딩 모듈은 스레드 웹 스크래핑과 웹 응용 프로그램의 성능 테스트에 충분히 빠를 것 같습니다. – Andy