2010-05-12 6 views
2
를 사용

가정하자 I는 C가 (++) 함수는 정수를 복용하고, 파이썬 API로 (C) 파이썬에 결합되므로, I 파이썬에서 호출 할 수호 배수 C++ 함수 스레드

import c_module 
c_module.f(10) 

지금은 병렬화하고 싶습니다. 문제는 다음과 같습니다.이 경우 GIL은 어떻게 작동합니까? 처리 할 숫자 대기열이 있고 일부 작업자 (threading.Thread)가 병렬로 작업 중이며 각각 c_module.f(number) (number)을 대기열에서 가져온 것으로 가정합니다.

GIL이 인터프리터를 잠글 때 일반적인 경우와 다른 점은 컴파일러가 있기 때문에 c_module.f을 평가할 인터프리터가 필요 없다는 것입니다. 그래서 질문은 :이 경우 가공은 실제로 평행입니까?

+0

파이썬에서 스레드를 사용하여 속도가 많이 빨라질 것이라고 생각하지 않습니다. 더 나은 방법은 OpenMP를 사용하여 포트 런 함수의 수를 병렬화하고 벡터화 된 데이터로 호출하는 것입니다. –

답변

3

명시 적으로 GIL이 릴리스 된 C 확장 코드를 실행중인 스레드는 병렬로 실행됩니다. 내선 번호에서 수행해야 할 작업은 http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock을 참조하십시오.

파이썬 스레드는 I/O 바운드 실행이나 GUI 응답에 가장 유용합니다. 스레드로 파이썬이 많이 실행되지는 않을 것입니다. 병렬 처리를 보장하려면 multiprocessing 라이브러리를 확인하십시오.

+0

파이썬의 멀티 프로세싱은 모든 문제를 해결하지 못합니다. 왜냐하면 모든'f' 함수는 플로트 수의 거대한 벡터를 반환해야하고 공유 메모리가 없으면 매우 비싸기 때문입니다. –

+0

c_module이 코드입니까? 그렇다면 처리 집약적 인 부분에 GIL을 출시하고 있습니까? –

+0

예, 제 코드이지만 GIL을 relase하는 방법을 모르겠습니다. 만약 그렇다면, 내 C++ 함수가 GIL 문제없이 실행됩니까? –