프로그래밍 언어/Python

파이썬에서 스레딩을 사용하는 방법

Rateye 2021. 9. 14. 10:21
728x90
반응형
질문 : 파이썬에서 스레딩을 어떻게 사용할 수 있습니까?

파이썬에서 스레딩을 이해하려고합니다. 문서와 예제를 살펴 봤지만 솔직히 많은 예제가 지나치게 정교하여 이해하는 데 어려움이 있습니다.

멀티 스레딩을 위해 분할되는 작업을 어떻게 명확하게 표시합니까?

답변

이 질문이 2010 년에 제기 된 이후로 mappool을 사용 하여 Python으로 간단한 멀티 스레딩을 수행하는 방법이 실제로 단순화되었습니다.

아래 코드는 반드시 확인해야하는 기사 / 블로그 게시물에서 발췌 한 것입니다 (제휴 없음)- 한 줄의 병렬 처리 : A Better Model for Day to Day Threading Tasks . 아래에 요약하겠습니다. 코드 몇 줄로 끝납니다.

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
results = pool.map(my_function, my_array)

다음의 다중 스레드 버전은 무엇입니까?

results = []
for item in my_array:
    results.append(my_function(item))

기술

Map은 멋진 작은 기능이며 Python 코드에 병렬 처리를 쉽게 삽입하는 열쇠입니다. 익숙하지 않은 사람들을 위해 map은 Lisp와 같은 기능적 언어에서 가져온 것입니다. 시퀀스에 다른 함수를 매핑하는 함수입니다.

Map은 시퀀스에 대한 반복을 처리하고 함수를 적용하며 모든 결과를 마지막에 편리한 목록에 저장합니다.

여기에 이미지 설명 입력

이행

map 함수의 병렬 버전은 다중 처리와 거의 알려지지 않았지만 똑같이 환상적인 단계 자식 : multiprocessing.dummy의 두 라이브러리에서 제공됩니다.

multiprocessing.dummy 는 다중 처리 모듈과 정확히 동일 하지만 대신 스레드를 사용합니다 ( 중요한 차이점 -CPU 집약적 인 작업에는 다중 프로세스를 사용하고 I / O에는 스레드를 사용합니다 ).

multiprocessing.dummy는 다중 처리 API를 복제하지만 스레딩 모듈을 둘러싼 래퍼에 지나지 않습니다.

import urllib2
from multiprocessing.dummy import Pool as ThreadPool

urls = [
  'http://www.python.org',
  'http://www.python.org/about/',
  'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
  'http://www.python.org/doc/',
  'http://www.python.org/download/',
  'http://www.python.org/getit/',
  'http://www.python.org/community/',
  'https://wiki.python.org/moin/',
]

# Make the Pool of workers
pool = ThreadPool(4)

# Open the URLs in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)

# Close the pool and wait for the work to finish
pool.close()
pool.join()

타이밍 결과 :

Single thread:   14.4 seconds
       4 Pool:   3.1 seconds
       8 Pool:   1.4 seconds
      13 Pool:   1.3 seconds

여러 인수 전달 (이는 Python 3.3 이상에서만 작동 함) :

여러 배열을 전달하려면 :

results = pool.starmap(function, zip(list_a, list_b))

또는 상수와 배열을 전달하려면 :

results = pool.starmap(function, zip(itertools.repeat(constant), list_a))

이전 버전의 Python을 사용하는 경우이 해결 방법을 통해 여러 인수를 전달할 수 있습니다.

(유용한 의견 을 주신 user136036 에게 감사드립니다.)

출처 : https://stackoverflow.com/questions/2846653/how-can-i-use-threading-in-python
728x90
반응형