2016-08-09 4 views
6

나는 어디에서나 검색했으며 멀티 스레딩으로 루프를 반복하는 간단한 예제를 찾지 못했습니다.파이썬에서의 단순 다중 스레드 for 루프

예를 들어이 루프를 멀티 스레드하려면 어떻게해야합니까?

for item in range(0, 1000): 
    print item 

4 개의 스레드와 같이 잘라낼 수있는 방법이 있습니까? 하나의 스레드는 250 개의 반복이 있습니까?

답변

3

가장 쉬운 방법은 multiprocessing.dummy 함께 (대신 프로세스의 스레드를 사용하는)과 Pool

import multiprocessing.dummy as mp 

def do_print(s): 
    print s 

if __name__=="__main__": 
    p=mp.Pool(4) 
    p.map(do_print,range(0,10)) # range(0,1000) if you want to replicate your example 
    p.close() 
    p.join() 

은 어쩌면 당신은 당신이 더 여러 개의 CPU를 사용하고 싶지만 여러 가지주의가 너무 경우, 실제 멀티를 시도하려는 및 guidelines.

아마도 다른 방법이 Pool 일 것입니다. 실제로 수행하려는 작업에 따라 필요에 더 잘 맞을 것입니다.

+0

감사합니다! 'do_print' 함수에 다른 인수를 전달해야한다면? – Anthony

+0

이 다릅니다 - 다중 처리. 문제가 없지만 iterable에 args를 넣어야하는지 확인하려면 - 예 : [zip] (https://docs.python.org/2.7/library/functions)을 사용하십시오. .html # zip) 또는 [list comprehensions] (https://docs.python.org/2.7/tutorial/datastructures.html#list-comprehensions) – janbrohl

+0

어떤 이유로이 코드는 반복 할 스레드를 약 60 개 (!) 생성합니다 ''나 (파이썬 3.5)에 대한 범위 (0, 1000) ... – ForceBru

4

수동으로 분할해야 할 것이다 :

import threading 

def ThFun(start, stop): 
    for item in range(start, stop): 
     print item 

for n in range(0, 1000, 100): 
    stop = n + 100 if n + 100 <= 1000 else 1000 
    threading.Thread(target = ThFun, args = (n, stop)).start() 

이 코드는 사용 멀티 스레딩, 모든 것이 하나의 파이썬 프로세스 내에서 실행되는 것을 의미합니다 (즉, 하나의 파이썬 인터프리터가 시작됩니다) . 다른 대답에서 논의

멀티은 (여러 프로세스하지 스레드에) 여러 파이썬 인터프리터에 몇 가지 코드를 실행 을 의미한다. 이 방법은 사용 가능한 모든 CPU 코어를 사용할 수 있으므로 단순히 병렬 처리가 아닌 코드 속도에 집중할 때 유용합니다 (은 터미널을 싫어할 때까지 숫자를 인쇄합니다!).


multiprocessing.dummy1. 1

a wrapper around the threading module 밝혀. multiprocessingmultiprocessing.dummy은 동일한 인터페이스를 가지고 있지만, 첫 번째 모듈은 프로세스 인을 사용하고, 후자는 스레드을 사용하여 병렬 처리를 수행합니다.

+0

다중 처리. 더미는 실제로 쓰레드를 사용합니다. 내 대답을 편집하여 더 명확하게 만듭니다. – janbrohl

+0

'multiprocessing.dummy'는 실제로'threading' 모듈을 감싸는 래퍼이지만'multiprocessing' 그 자체는 대답. 어느 것이 선택되는지는 사람이 원하는 행동에 달려 있습니다. 코드는 매우 똑같습니다 (좋은 것입니다). – miraculixx

+0

@miraculixx, 이것이 바로 지금 횡단 된 부분을 완전히 제거하지 않기로 결정한 이유입니다.'multiprocessing'과'multiprocessing.dummy'는 비슷한 인터페이스를 가지고 있습니다 만, 모듈의 선택은 동작 (threads 대 프로세스)에 영향을줍니다. – ForceBru