[PYTHON] threading.Thread.join ()의 사용
PYTHONthreading.Thread.join ()의 사용
파이썬에서 멀티 스레딩을 처음 사용하고 스레딩 모듈을 사용하여 멀티 스레딩을 배우려고합니다. 멀티 스레딩의 아주 간단한 프로그램을 만들었고 threading.Thread.join 메서드를 이해하는 데 문제가 있습니다.
다음은 내가 만든 프로그램의 소스 코드입니다.
import threading
val = 0
def increment():
global val
print "Inside increment"
for x in range(100):
val += 1
print "val is now {} ".format(val)
thread1 = threading.Thread(target=increment, args=())
thread2 = threading.Thread(target=increment, args=())
thread1.start()
#thread1.join()
thread2.start()
#thread2.join()
내가 사용하면 어떤 차이가 있니?
thread1.join()
thread2.join()
위 코드에서 주석을 달았습니다. 소스 코드 (주석이 달린 코드와 주석이없는 코드)를 모두 실행했지만 출력은 같습니다.
해결법
-
==============================
1.thread1.join ()에 대한 호출은 thread1이 끝날 때까지 호출중인 스레드를 차단합니다. wait_until_finished (thread1)와 같습니다.
thread1.join ()에 대한 호출은 thread1이 끝날 때까지 호출중인 스레드를 차단합니다. wait_until_finished (thread1)와 같습니다.
예 :
import time def printer(): for _ in range(3): time.sleep(1.0) print "hello" thread = Thread(target=printer) thread.start() thread.join() print "goodbye"
인쇄물
hello hello hello goodbye
- .join () 호출없이, 작별 인사가 먼저 온 다음 3 * 안녕하세요.
또한 파이썬의 쓰레드는 전역 인터프리터 잠금 (Global Interpreter Lock)이라는 이유로 CPU 성능과 관련하여 추가적인 성능을 제공하지 않으므로 잠재적 인 블로킹 (예 : IO, 네트워크) 및 시간 소모적 인 주 스레드를 다른 작업을 위해 자유롭게 유지하기위한 작업 (예 : 숫자 크런치)은 여러 코어 나 CPU를 활용할 수 없도록합니다. 이를 위해 서브 프로세스를 사용하지만 스레딩과 동일한 API를 제공하는 다중 처리를 살펴보십시오.
PLUG : ... 위와 같은 이유 때문에 동시성에 관심이 있다면 Gevent라는 훌륭한 라이브러리를 살펴볼 수도 있습니다. Gevent는 기본적으로 스레딩을 훨씬 쉽게 사용하고 훨씬 빠르게 동시 작업이 많으며 동시성 관련 버그가 적고 "실제"스레드와 동일한 방식으로 코딩을 유지할 수 있습니다. 또한 Twisted, Eventlet, Tornado 및 기타 여러 항목은 동등하거나 비슷한 수준입니다. 게다가, 어쨌든, 나는이 고전을 읽을 것을 강력히 권합니다.
-
==============================
2.코드가 수정되어 정확하게 결합하는 방법을 이해할 수 있습니다. 이 코드를 주석없이 주석없이 실행하고 두 가지 모두에 대한 출력을 관찰하십시오.
코드가 수정되어 정확하게 결합하는 방법을 이해할 수 있습니다. 이 코드를 주석없이 주석없이 실행하고 두 가지 모두에 대한 출력을 관찰하십시오.
val = 0 def increment(msg,sleep_time): global val print "Inside increment" for x in range(10): val += 1 print "%s : %d\n" % (msg,val) time.sleep(sleep_time) thread1 = threading.Thread(target=increment, args=("thread_01",0.5)) thread2 = threading.Thread(target=increment, args=("thread_02",1)) thread1.start() #thread1.join() thread2.start() #thread2.join()
-
==============================
3.관련 문서에 설명되어 있듯이 join은 스레드가 종료 될 때까지 호출자를 대기 상태로 만듭니다.
관련 문서에 설명되어 있듯이 join은 스레드가 종료 될 때까지 호출자를 대기 상태로 만듭니다.
여러분의 경우 join은 프로그램 동작을 변경하지 않기 때문에 결과는 동일합니다. 모든 스레드가 종료되었을 때만 프로그램을 깨끗하게 종료하는 데 사용됩니다.
from https://stackoverflow.com/questions/19138219/use-of-threading-thread-join by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파일을 수치로 어떻게 정렬합니까? (0) | 2018.10.23 |
---|---|
[PYTHON] 파이썬 - 파이프와 쉘 명령을 실행하는 방법? (0) | 2018.10.23 |
[PYTHON] Tensorflow : Tensorboard에서 사용자 정의 이미지를 표시하는 방법 (예 : Matplotlib Plots) (0) | 2018.10.23 |
[PYTHON] 파이썬에서 영어 수축 확장하기 (0) | 2018.10.23 |
[PYTHON] SciPy / Numpy를 사용하여 Python에서 희소 행렬 연결 (0) | 2018.10.23 |