2013-01-08 5 views
1

일부 멀티 스레드 CPython 코드를 프로파일 링합니다.
특정 코드 세그먼트를 실행하는 데 걸리는 시간을 측정하기 위해 GIL (Global Interpreter Lock)으로 설정하고 해당 세그먼트의 스레드 간을으로 바꾸고 싶습니다. 어떻게 할 수 있습니까?GIL이 스레드를 전환하지 않도록하십시오.

UPDATE :
다음 의사 코드를 가정 :

some_code_1() 
make_the_interpreter_not_change_thread() 
take_start_time() # time critical 
code_to_profile() # time critical 
take_end_time()  # time critical 
release_the_interpreter() 
some_code_2() 

내 관심사는 인터프리터가 '시간이 중요한'기간을 프로파일 링하는 동안 스레드를 전환 할 것입니다.

답변

5

GIL은 스레드를 전환하지 않습니다. GIL은 다중 스레드가 동시에 바이트 코드를 실행하지 못하게하는 뮤텍스입니다. 따라서 스레드 전환을 방지하려면 다른 곳을 찾아야합니다.

코드를 프로파일하는 동안 전환을 막기 위해 sys.setcheckinterval()을 매우 큰 값으로 호출 할 수 있습니다.

sys.setcheckinterval(count)에 전화 할 때마다 현재 '카운터'가 새 값으로 재설정되므로 호출하자마자 스레드 전환이 최소한 count 바이트 코드 명령어에 허용됩니다.

+0

내 질문에 대한 업데이트보기 'make_the_interpreter_not_change_thread()'에서'sys.setcheckinterval()'을 통해 많은 수를 배치 할 수 있습니까? 인터프리터가 파이썬 가상 명령어의 현재 카운트를 변경하거나 새로운 값이'code_to_profile()'중에 유감스럽게도 발생할 수있는 인터프리터 검사의 다음 사이클에만 영향을 주겠습니까? – Jonathan

+1

@Jonathan :이 함수는 호출 될 때 현재 카운트를 재설정합니다. 따라서 큰 값으로 호출하면 해당 바이트 코드 명령어 수만큼 스레드 전환이 수행되지 않습니다. –