복붙노트

[PYTHON] threading.Thread.join ()의 사용

PYTHON

threading.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. ==============================

    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. ==============================

    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. ==============================

    3.관련 문서에 설명되어 있듯이 join은 스레드가 종료 될 때까지 호출자를 대기 상태로 만듭니다.

    관련 문서에 설명되어 있듯이 join은 스레드가 종료 될 때까지 호출자를 대기 상태로 만듭니다.

    여러분의 경우 join은 프로그램 동작을 변경하지 않기 때문에 결과는 동일합니다. 모든 스레드가 종료되었을 때만 프로그램을 깨끗하게 종료하는 데 사용됩니다.

  4. from https://stackoverflow.com/questions/19138219/use-of-threading-thread-join by cc-by-sa and MIT license