2013-02-20 14 views
5

난 그냥이 새로운 구현에 대한 검색, 그리고 파이썬 2.7을 사용하여, 내가 this을 설치해야합니다, 그래서 그것을 사용하는 경우, 나는 CPython에 단어 GIL을 잊어 버리시겠습니까?concurrent.futures는 GIL의 약입니까?

+1

http://www.dalkescientific.com/writings/diary/archive/2012/01/19/concurrent.futures.html –

+1

http://docs.python.org/dev/library/concurrent.futures.html # module-concurrent.futures - GIL에 대해서는 아무 것도 언급하지 않기 때문에 사용하는 스레드는 분명히 진실한 스레드입니다. 그렇지 않으면, 왜이 hulabaloo를 왜 귀찮게합니까? –

+0

비동기 코드가 concurrent.futures를 사용하는 것을 좋아한다는 것을 알았 기 때문에 GIL의 medecine이라고했습니다. –

답변

12

아니요, concurrent.futures에는 GIL과 관련이 거의 없습니다.

스레드 대신 프로세스를 사용하면 GIL의 약이됩니다. (물론, 모든 의학처럼, 그것은 부작용이있다. 그러나 그것은 작동합니다.)이 futures 모듈은 당신에게 예약하고 직접 threading 또는 multiprocessing을 사용하는 것보다 작업에 대기하는 간단한 방법을 제공합니다

. future 코드를 변경하지 않고도 스레드 풀과 프로세스 풀 (그리고 심지어는 Greenlet 루프 또는 사용자가 발명하여 빌드 한 것)간에 바꿀 수 있다는 이점이 있습니다. 따라서 코드에 GIL 문제가 있는지 여부를 모르는 경우 스레드를 사용하도록 코드를 빌드 한 다음 단 한 줄의 변경으로 프로세스를 사용하도록 전환 할 수 있습니다.

ThreadPoolExecutor을 사용하면 threadingqueue을 사용하여 스레드 풀, 작업 대기열 등을 수동으로 생성 한 경우와 완전히 동일한 GIL 문제가 발생합니다. ProcessPoolExecutor을 사용하는 경우 multiprocessing을 수동으로 사용한 것과 같은 방식으로 (동일한 절충을 통해) GIL 문제를 피할 수 있습니다.

그리고 PyPI 패키지는 concurrent.futures 모듈이 3.2에서 2.x (및 3.0-3.1)의 간단한 백 포트에 불과합니다. (그것은 마술 GIL을 제거 훨씬 적은 당신에게 새로운 -와 - 정렬의-개선 된 3.2 GIL, 또는 더-개선 된 3.3 GIL를 제공하지 않습니다.)


나는 아마이 안 혼란이 추가 된 것 같아서 GIL이 바뀌 었다고 언급했는데 ... 지금은 지나치게 간소화하여 그것을 바로 잡으려고합니다.

IO 바인딩 작업 외에 아무것도없는 경우 스레드는 합리적인 한계까지 동시성을 얻는 가장 좋은 방법입니다. 3.3은 더 잘 작동합니다. 그러나 대부분의 경우, 2.7은 이미 충분히 훌륭합니다. 대부분의 경우 3.3이 아직 충분하지 않습니다. 10000 개의 동시 클라이언트를 처리하려는 경우 스레드 대신 이벤트 루프 (예 : twisted, tornado, gevent, tulip 등)를 사용하려고합니다.

CPU와 관련된 작업이있는 경우 스레드가 해당 작업을 병렬 처리하는 데 전혀 도움이되지 않습니다. 사실 그들은 상황을 악화시킵니다. 3.3 페널티는 그렇게 나쁘지는 않지만, 여전히 벌칙이다. 당신은 여전히 ​​이것을해서는 안된다. CPU 작업을 병렬 처리하려면 스레드가 아닌 프로세스를 사용해야합니다. 3.3의 유일한 이점은 futuresmultiprocessing보다 약간 사용하기 쉽고, 설치해야하는 대신 내장되어 있다는 것입니다.

2.7보다 나은 언어를 더 잘 구현할 수 있기 때문에 3.3으로 옮기는 것을 꺼려하지 않습니다. 그러나 더 나은 동시성이 이동해야 할 이유는 아닙니다.

+0

그래서 그들은 서로 다른 것들입니다! 그것은 GIL이 3.2에 다시 쓰여졌 기 때문에 동시성이있는 것 같습니다. 문제를 해결하는 미래, 감사합니다. –

+2

@AbdelouahabPp : 아니,'concurrent.futures'는 문제를 해결하지 못합니다. 동시 코드를 작성하는 것이 약간 더 간단합니다. 3.2와 3.3의 GIL에 대한 변경은 완전히 독립적이며, 10 년 넘게 최초의 중요한 GIL 변경이'futures' 라이브러리와 동일한 버전의 Python에 도착한 것은 단지 우연의 일치입니다. – abarnert

+0

그래서 우수한 동시 코드를 원한다면 3.3으로 전환해야합니다! 고마워요. :)이 스레드는 내가 생각하기에 더 많은 아이디어를 얻으려는 초보자이며, 토네이도와 함께이 라이브러리를 발견하기 위해 서버 시간으로 되돌아 갈 것이기 때문에 미안합니다. –