2016-10-04 6 views
0

나는 스레드와 멀티 프로세싱에 익숙하지 않다. 나는이 과정을 시작하는 몇 가지 코드를 가지고 있고 나는 아래 코드는 이와 비슷한입니다이파이썬 스레드와 문자열

wating.... 

처럼 뭔가의 활성 대기 상태를 표시하도록 출력을 원 :

수입 수입 시간

스레딩

timer started 
Do something else..timer finished 
. 
Hooray! 
,369 : 나는 위의 코드를 실행하면
class ThreadExample(object): 

    def __init__(self): 
     self.pause = True 
     threading.Thread(target=self.second_thread).start() 
     # Some other processes 
     print("Waiting", end="") 
     while self.pause: 
      time.sleep(1) 
      print(".", end="") 
     print("Hooray!") 

    def second_thread(self): 
     print("timer started") 
     time.sleep(3) 
     self.pause = False 
     print("timer finished") 

if __name__ == "__main__": 
    ThreadExample() 

, 내가 출력을 수신

처음에는 'timer started'만 나타나고 나머지 텍스트는 끝에 순간적으로 나타납니다. 상기 도트를 1 개 초 단위로 표시

timer started 
Do something else. 
. 
timer finished 
. 
Hooray 

: I는 라인 출력을 변경하는 경우

(".", 끝 = '') (. ") 인쇄"I는 다음과 같은 결과가 나타날 그게 내 의도 였어.

end = ""없이 한 줄에 'Waiting ...'을 얻을 수있는 방법이 있습니까?

둘째로 나는 print() 함수의 내부와 관련이 있다고 생각하고 그렇지 않다면 다른 방식으로 스레딩을 수행해야합니까? 문제가 GIL이라고 생각하지 않습니다. 다중 처리를 시도했습니다. 프로세스와 동일한 결과를 얻었습니다.

답변

1

이것은 아마도 print 버퍼링으로 인한 것입니다. \n 및 일부 다른 경우 (버퍼 오버 플로우 또는 프로그램 종료와 같은)에 플러시됩니다. 대신 print의이 시도 :

import sys 

def unbuffered_print(msg): 
    sys.stdout.write(msg) 
    sys.stdout.flush() 

... 
unbuffered_print('.') 

을 사방.

+0

참고 : 현대 Python (3.3 이상)에서 [print '는 인쇄 후 플러시되도록'flush = True'로 전달할 수 있습니다] (https://docs.python.org/3/library/functions. html # print),'print' 함수의 모든 힘/유연성을 유지합니다. 따라서 print (end = '.', flush = True)'또는'print ('.', end = '', flush = True)'도 트릭을 수행합니다. – ShadowRanger

+0

감사합니다. 매우 유용합니다. – VectorVictor