2010-12-07 5 views
3

나는 아름다운 멀티 스레드 스크립트를 작성했고, 실행했을 때 스레드 처리기를 직접 호출하는 것보다 25 개의 스레드에서 성능이 떨어졌습니다.파이썬에서 스레딩 작업을하는 것과 같은 것이 있습니까?

그런 다음 전역 해석기 잠금을 발견했습니다. 이 스크립트에 대한 파이썬을 버리고 다른 것을 다시 작성하기 전에 실제로 파이썬에서 멀티 스레딩 작업을 수행 할 수있는 방법이 있습니까?

답변

9

또 다른 접근법은 스레드를 포기하고 대신 GIL 주위에있는 Multiprocessing 모듈 (Python 2.6 이상)을 사용하고 스레드 모듈의 스레드와 적어도 비슷한 API를 사용합니다.

0

내 지식에 따르면 CPython (C로 된 Python 구현)에서는 아니요. (내가 틀렸다면, 제발 해결해주세요. 해결책이 있는지 알고 싶습니다.).

IronPython (.NET) 또는 JPython (Java/JWM)에 관심이있을 수 있습니다. 나는 그것들을 사용하지 않았지만 적어도 하나의 스레드가 주어진 실행 환경의 네이티브 스레드를 지원한다고 믿습니다.

3

이제 재미있는 질문입니다. CPython에서 곧장 GIL을 벗어날 수 있다고 생각하지 않습니다.

Stackless Pythonmicrothreads을 사용하여 CPython보다 개선 된 "동시성"성능을 갖지만 GIL을 이스케이프하지 않습니다.

또한, GIL page on python.org에 따르면 Jython과 IronPython에는 GIL이 없습니다.

+1

스택없는 파이썬은 다중 코어를 활용하지 않으며 태스크 릿은 여전히 ​​순차적으로 실행됩니다. –

0

문제에 해당하는 경우 multiprocessing 모듈을 사용해 볼 수 있습니다.

1

정답은 수행중인 작업에 크게 의존합니다.

일반적으로 압축 및 이미지 렌더링과 같은 CPU 기반 바인딩 (및 IO 바인딩 차단) 작업은 일반적으로 원시 코드로 수행되며 기본 라이브러리는 정상적으로 GIL을 릴리스하므로 동시성이 보장됩니다. CPU 집약적 인 작업을 협소 한 네이티브 호출로 분리 할 수 ​​있으면 동시성, 계산할 수있는 기본 성능 및 대부분의 코드를 Python으로 작성하는 편리함을 얻을 수 있습니다.

모든 코드가 네이티브 라이브러리에 깔끔하게 구현 될 수있는 작고 격리 가능한 컴퓨터 코드 블록을 가지고있는 것은 아니지만 전체적으로 많은 부분이 있습니다.

관련 문제