2016-06-23 7 views
5

동료와 인수를 해결하려고합니다. psycopg2을 사용하여 Postgres 데이터베이스와 통신하는 Python 2.6 응용 프로그램이 있다고 가정 해보십시오. 앱이 멀티 스레드입니다. 스레드가 psycopg2을 사용하여 데이터베이스 호출을하면 다른 스레드가 데이터베이스 호출을 할 수 있도록 GIL이 해제됩니까?Python 2.x에서`psycopg2`가 GIL을 차단합니까

+0

시도는 소스 (https://github.com/psycopg/psycopg2/search?utf8=%E2%9C%93&q=py_begin_allow_threads+OR+pyeval_save_thread&type=Code) Py_BEGIN_ALLOW_THREADS''또는'PyEval_Save_Thread'를 검색] . 그들은 여기 저기에 뿌리고, 당신의 특정한 시나리오가 적용되는지 확인하십시오. –

답변

2

the Psycopg release notes을 잠시 살펴보면 GIL을 해제하는 데 많은 참조가 있습니다. 그래서 분명히 적절한 경우 GIL을 해제하려고 시도합니다. 특정 시나리오에 대해 묻지 않았으므로보다 구체적인 대답이 가능하지 않다고 생각합니다.

+0

"특정 시나리오"테이블에서 물건을 선택하여 가장 일반적인 데이터베이스 작업을 말해 보시겠습니까? –

0

GIL을 획득 한 스레드 만 파이썬 개체에서 작동하거나 파이썬/C API 함수를 호출 할 수 있다는 규칙이 있습니다. 실행의 동시성을 에뮬레이션하기 위해 파이썬 인터프리터는 정기적으로 스레드를 전환하려고 시도합니다. 잠금은 파일 읽기 또는 쓰기와 같은 I/O 작업을 차단할 가능성이 있기 때문에 해제되므로 다른 Python 스레드가 그 사이에 실행될 수 있습니다.

대부분 확장 코드 (psycopg2의 코드 포함) GIL 조작하면 다음과 간단한 구조 갖는다 :이 블록 I/O 동작 (예를 들어, 포스트 그레스에서 네트워크 응답 대기)가 발생한 경우 것을 의미

Save the thread state in a local variable. 
Release the global interpreter lock. 
... Do some blocking I/O operation ... 
Reacquire the global interpreter lock. 
Restore the thread state from the local variable. 

을 GIL이 해제되고 다른 스레드는 계속 실행될 수 있습니다. 블로킹 I/O 작업이 완료되면 스레드는 GIL을 획득하려고 시도하고 최종적으로 GIL을 획득 할 때 실행 (결과 처리 등)을 계속합니다.

psycopg2의 구현 here을 살펴보십시오.