2011-09-13 5 views
3
나는 사람들이 파이썬으로 작성

파이썬 글로벌 통역 잠금 GIL 문제

기본적으로 내가하고 싶은 것을 리눅스 시스템에서 실행되는 너 한테의 성능을 테스트 할 수있는 웹 서비스를 제공 할

그것은 매우 간단한 PHP 처리기입니다. start_algo.php는 브라우저에서 들어오는 요청을 받아들입니다. php 코드에서는 system() 또는 popen() (exec ("python algo.py")) 파이썬 스크립트를 실행하는 새로운 프로세스를 발행하려면이 부분에서 수행 가능하다고 생각합니다.

문제는 웹 서비스이므로 동시에 여러 사용자에게 서비스해야한다는 것이지만 매우 혼란 스럽습니다. 국제 통역사에 의한 자물쇠 GIL http://wiki.python.org/moin/GlobalInterpreterLock '표준'CPython이 구현되었다는 것을 의미합니다. 즉, 3 명의 사용자가 3 개의 분리 된 프로세스를 의미하고, 3 개의 분리 된 프로세스를 의미하는 경우, 특정 순간에, 내가 틀린 plz 일 경우 올바른 것을 의미합니다. 사용자가 파이썬 인터프리터에 의해 서비스되고 다른 2 명이 자신의 순서를 기다리고 있습니까? 사전에

많은 감사

테드

+0

아파치와'mod_wsgi'를 사용하고 있습니까? 그렇다면 동시 요청은 Python 외부의 해당 수준에서 잘 처리됩니다. 그렇지 않다면 왜 아파치 (또는 nginx)와 mod_wsgi를 사용하지 않는지 설명하십시오. –

+0

@ S.Lott thx하지만 문제는 동시 요청에 관한 것이 아니라 동시에 Python 스크립트를 실행하는 것입니다. cuz이 스크립트는 실행 시간이 오래 걸리는 반면 PHP 코드는 단순히 "python algo.py" "cmd –

+0

질문은 스크립트를 실행하는 각 요청과 동시 요청을 동기화합니다. 문제는 혼란 스럽다. 아파치와 mod_wsgi의 맥락에서 GIL을 언급 할 때마다, 당신은 정확히 무엇을하고 있는지를 설명해야한다. Apache가 요청을 분리합니다. 각 요청은 ** 별도의 ** 프로세스를 생성합니다. 아파치와 mod_wsgi에 의해 분리 된 각각의 요청은 실제로 별도의 서브 프로세스를 제출한다는 사실을 분명히 이해해야한다. 질문에서 - 당신이 이것을 이해하고 있음을 분명히 밝혀주십시오. –

답변

10

당신이 새로운 프로세스를 호출하여 각 스크립트를 개방하는 경우; 당신은 GIL에 맞서 싸우지 않을 것입니다. 각 프로세스는 고유 한 인터프리터를 가지므로 자체 인터프리터 잠금을 갖습니다.

+0

thx 많이, 매우 신속하고 도움이, 당 GIL 단위 당 내게 의미가 있습니다 –

6

The GIL is per-process. 여러 개의 python 프로세스를 시작하면 각 프로세스마다 인터프리터가 한 번에 둘 이상의 스레드를 실행하지 못하도록하는 자체 GIL을 갖게됩니다. 그러나 독립적 인 프로세스가 동시에 실행될 수 있습니다.

또한 하나의 파이썬 프로세스 내부에있는 여러 스레드가 실행 중 (오히려 빈번하게, 버전에 따라 수백 개의 opcode 명령어 또는 수십 밀리 초마다 IIRC가 실행 됨), GIL이 동시성을 전혀 방지하지 못합니다 단지 멀티- 스레딩을 방지합니다.

+0

많은 질문을하기 전에 더 많은 숙제를해야 delnan, 매우 상세한 설명을 주셔서 감사합니다, 비슷한 질문이 사이트에서 이미 요청되었습니다 –