1

저는 Programming Python 4th Edition을 읽고 있습니다.파이썬에서 멀티 스레드를 사용하는 출력이없는 이유는 무엇입니까?

$python3 thread-example.py 
$ 

는 사람이에 대한 아이디어가 있습니까 :

import _thread 

def action(i): 
    print(i ** 32) 

class Power: 
    def __init__(self, i): 
     self.i = i 
    def action(self): 
     print(self.i ** 32) 

_thread.start_new_thread(action,(2,)) 
_thread.start_new_thread((lambda: action(2)),()) 

obj = Power(2) 
_thread.start_new_thread(obj.action,()) 

내가 그것을 실행하면 아무 화면에 출력이 없다 :

코드 (Python3.2)들이다?

답변

1

주 스레드가 종료되면 전체 프로세스가 종료됩니다.

다른 스레드가 완료 될 때까지 주 스레드를 대기시켜야합니다. _thread API에 대한 규정이 없습니다 (API가 너무 낮음).

더 나은 API를 사용하려는 경우 threading.Thread.join()을 사용할 수 있습니다.

1

밑줄 _은 비공개 API (thread 모듈은 2005 년이 후 폐기되었습니다.)임을 의미합니다. 당신은 명시 적으로 .join() 메소드를 호출 할 필요가 없습니다

from threading import Thread 

# ... 
Thread(target=action, args=[2]).start() 
Thread(target=lambda: action(2)).start() 
Thread(target=obj.action).start() 

; 대신 threading 모듈을 사용한다 비 데몬 스레드는 주 스레드가 종료되기 전에 자동으로 조인됩니다.

0

threading 모듈 (here 확인)을 사용하지 않는 이유는 무엇입니까? 귀하의 예제에서 주 스레드는 자식 스레드가 아무것도 인쇄 할 수 없게됩니다. 당신이 추가 할 경우 예를 들어, 귀하의 예제의 끝에서 다음 내 시스템에서 작동합니다

import time 
time.sleep(5) 

을하지만 여전히 당신은 보장 할 수 없습니다 모든 자식 전에 종료되지는 더 복잡한 경우에 종료 스레드 것이라고 메인 스레드. 다음과 같은 선택을 할 수 있습니다 :

  • 각 하위 스레드의 플래그를 설정하고 종료하기 전에 주 스레드의 플래그를 계속 점검합니다 (불량 접근).
  • time.sleep을 사용하면 모든 하위 스레드가 종료 될 수있는 최대 시간 동안 대기 상태가됩니다 (잘못된 접근 임).
  • threading.Thread.join을 사용하면 각 어린이가 나올 때까지 기다릴 수 있습니다 (좋은 접근 방법). (다른 답변에서 분명히 알 수 있듯이)
관련 문제