2010-12-01 4 views
5

내 Windows 상자에서 방대한 데이터 처리를 수행하는 단일 스레드 파이썬 프로그램을 실행하고 있습니다. 내 컴퓨터에는 8 개의 프로세서가 있습니다. Windows 작업 관리자에서 성능 탭의 CPU 사용량을 모니터링 할 때 사용할 수있는 처리 능력의 극히 일부만 사용하고 있음을 나타냅니다. 하나의 프로세서 만 사용하고 나머지는 거의 유휴 상태입니다. 내 프로세서를 모두 사용하려면 어떻게해야합니까? 멀티 스레드는 솔루션입니까?컴퓨터의 모든 프로세서를 사용하기 위해 프로그래밍하는 방법은 무엇입니까?

+1

예 멀티 스레딩이 필요합니다. – cspolton

+0

그러나 프로그램에 대한 설명이 없으면 –

+0

멀티 스레딩이 필요하지 않은지 여부를 말할 수 없습니다. –

답변

6

멀티 스레딩에서는 추가 프로세서 나 코어를 사용할 수 없습니다.

새 스레드 대신 새 프로세스를 생성해야합니다.

이 도구는 내가 건너 온 모든 중 가장 간단한 지금까지 : parallel python

개요 :

PP는 SMP에 파이썬 코드의 병렬 실행을위한 메커니즘을 제공 파이썬 모듈입니다 (다중 프로세서 시스템 또는 코어) 및 클러스터 (네트워크를 통해 연결된 컴퓨터 ).

다른 파이썬 소프트웨어와 설치하고 통합하기가 쉽습니다.

PP는

+1

나는 내 대답을 간소화했다. 컨텍스트는 물론 파이썬으로 코딩하기 때문에 여러분과 다른 사람들이 언급 한 제한이 있습니다. – kakarukeys

+0

병렬 처리 라이브러리를 언급 한 +1 – invert

+0

@Forest : http://us.pycon.org/2010/conference/schedule/event/76/을 검토하고 공통적으로 보유하고있는 (일반적으로 잘못된) 지혜를 재고해야합니다. 일부 스레딩 GIL을 사용해도 효율적일 수 있습니다. GIL은 당신이 이론을 상상할 수있는 것을 무시한 정말로 드문 실용적인 효과를 가지고 있습니다. –

1

병렬 처리 가능하다고 가정하면 예, 스레딩은 확실히 해결책입니다. 특히 처리 할 데이터 항목이 많지만 모두 처리 할 수있는 경우 독자적으로 병렬 처리하는 것이 상대적으로 쉽습니다.

다중 스레드 대신 여러 프로세스를 사용하는 것 다른 해결책이 될 수 있습니다.

+0

사실 여러 프로세스 *는 동일한 프로세스의 여러 스레드를 여러 코어에 분산시키는 것이 특정 플랫폼/OS에서 지원되지 않을 수 있으므로 가장 일반적인 솔루션입니다. – knitti

+0

@knitti : 질문은 특히 Windows에 관한 것입니다. 여러 프로세스를 사용하면 스레드가 그리 나쁘지 않을 가능성이있는 시점에 불편할 수 있습니다. –

+0

미안하지만, 분명히 독서 기술을 연마해야합니다 ... 그러나 호기심에서 : 왜 여러 프로세스가 그렇게 불편할 것이라고 생각합니까? – knitti

2

단일 프로세스에는 다중 스레딩이 필요하지만 반드시 솔루션 일 필요는 없습니다. 프로세서 동질성은 모든 스레드를 사용할 수있는 충분한 스레드가 있더라도 사용 가능한 코어의 하위 집합으로 제한 할 수 있습니다.

+0

당신은 정말로 "해결책이 아닙니다"또는 "해결책이 아닐 수도 있습니다"라는 뜻입니까? 프로세서 친 화성 *이 분명히 문제가됩니까? –

+0

@Jon : 업데이트되었습니다. –

+0

대단히 감사합니다. 훨씬 더 의미가 있습니다. 파이썬 내에 문제를 일으킬 수있는 핸디캡이 있는지 궁금 해서요. –

2

당신은 당신의 프로그램이 형태의 경우 python's multiprocessing module

멀티는 그것이있다 파이썬 코드와 그 모든 코어를 사용하는 것이 가능하도록 GIL 문제를 방지 여러 파이썬 프로세스를 사용하여 혜택을 누릴 것이라고 것을 얻을 수 있습니다 쉽게 나사지도 더 복잡한 방식

는 파이썬 평행 유사하지만, 로컬 머신에 제한 파이썬 2.6 이상 포함되고, 파이썬가 가산 같이

+0

답변을 확장하십시오. 네가하는 말을 이해하지 못한다. – invert

2

스레딩에 비유 비슷위한 기초 존이 말한 것, 당신이 표준 파이썬 인터프리터에서는 멀티 스레딩과 관련된 한계를 이해해야합니다. 쓰레드가 순수 파이썬이고 시스템 호출을하지 않으면 Global Interpreter Lock 때문에 여러 프로세서에서 동시에 실행할 수 없으므로 멀티 스레딩의 이점은 최소화됩니다. 이 경우 전역 인터프리터 잠금 기능이없는 JPython 또는 IronPython과 같은 다른 Python 구현으로 전환하거나 여러 프로세스를 사용하는 것이 좋습니다.

1

이렇게 순수 Python으로 작성된 오픈 소스와 크로스 플랫폼 모듈입니다.

단계별 또는 단계별로 작업을 분할하십시오. 각 단계는 무언가를 읽고 전체 계산의 일부를 수행하며 무언가를 씁니다.

"""Some Step.""" 
import json 
for some_line in sys.stdin: 
    object= json.loads(some_line) 
    # process the object 
    json.dump(result, sys.stdout) 

이와 비슷한 것이 좋습니다.

전달해야 할 개체가 여러 개인 경우 개체의 간단한 사전을 만드십시오.

results = { 'a': a, 'b': b } 

이와 같이 파이프 라인에 연결하십시오.

python step1.py | python step2.py | python step3.py >output_file.dat 

8 단계 이상으로 문제를 해결할 수있는 경우 8 개 이상의 코어를 사용합니다. 그리고, BTW, 이것은 아주 작은 실제 작업을 위해 엄청나게 빠를 것입니다.

관련 문제