1

마우스 좌표 (x, y) 및 시간 스탬프마다 100ms을 인쇄하는 코드가 있습니다. 에 10 초 동안 실행하고 싶습니다.. 그게 전부 야. 파이썬 코드가 10 초 후에도 계속 실행되는 이유는 무엇입니까?

그래서 나는 " 멀티 프로세싱"구현 나는 멀티 기능 내부에서 주요 기능을 "printevery100ms" 전화를 초기화하고 나는 그것이 10 초 후에 종료했다.

는하지만 그 대신 10 초 후에 종료, 그것은

여기 코드의 ... p.terminate() 명령을 건너 뛰어 실행 및 실행 유지합니다.

import multiprocessing 
import time 
import threading 
import datetime 


def printevery100ms(): 

    threading.Timer(.1,printevery100ms).start() 
    ts = time.time() 
    st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 


    from ctypes import windll,Structure,c_int,byref 

    class POINT(Structure): 

    _fields_ = [("x",c_int),("y",c_int)] 

    def queryMousePosition(): 

     pt = POINT() 
     windll.user32.GetCursorPos(byref(pt)) 
     return {"x": pt.x,"y": pt.y} 

    pos = queryMousePosition() 

    print('{{\'x\': {}, \'y\': {}}}'.format(pos['x'],pos['y']),st) 

printevery100ms() 


if __name__ == '__main__': 

     # Start printevery100ms as a process 
     p = multiprocessing.Process(target=printevery100ms, name="printevery100ms", args=(10,)) 
     p.start() 

     # Wait 10 seconds for printevery100ms 

     time.sleep(10) 
     # Terminate printevery100ms 
     p.terminate() 

     p.join() 
     print "Not Terminated" 

는 그래서 멀티 코드는 10 초 타이머를 초기화하고 종료 명령의 목적은 10 초 후에 시스템을 종료하기로했다. 10 초 후에도 코드가 멈추지 않으면 "종료되지 않음"을 출력하는 인쇄 명령을 작성했습니다. 그것은 정확하게 일어난 일입니다. 여기

은 결과입니다 (9 초 후에 ..)

("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58') 
("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58') 
("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58') 
Not Terminated 
("{'x': 1205, 'y': 399}", '2017-01-19 13:31:58') 
("{'x': 961, 'y': 410}", '2017-01-19 13:31:58') 
("{'x': 610, 'y': 407}", '2017-01-19 13:31:58') 

당신은 그것이 10 초 동안 실행하고 그것이 종료에 도착 의미 "종료되지 않음"인쇄하는 것 볼 수 있듯이 명령을 실행하지만 아무 일도 일어나지 않는 것처럼 계속 실행합니다. 제가 잘못하고있는 일이나 이것이 다중 처리와 관련이 있다면 나에게 말해 주실 수 있습니까?

답변

0

당신이 코드를 사용하여 몇 가지 문제가있다 : 스타일 관점에서

  1. , 당신은 printevery100ms 함수 내에서 들여 쓰기를 다른했다.
  2. printevery100ms()if __name__ == '__main__': (오른쪽 줄 30) 전에 호출되어 주 스레드에서 함수를 실행하고 멈추지 않습니다.
  3. multiprocessing.Process을 호출하면 printevery100ms을 (10,) 인수로 호출하므로이 호출이 실패합니다. 그러나 주 스레드가 계속 실행되어 정지되는 것처럼 보이지 않습니다.

    import multiprocessing 
    import time 
    import threading 
    import datetime 
    
    
    def printevery100ms(): 
    
        threading.Timer(.1,printevery100ms).start() 
        ts = time.time() 
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 
    
    
        from ctypes import windll,Structure,c_int,byref 
    
        class POINT(Structure): 
    
         _fields_ = [("x",c_int),("y",c_int)] 
    
        def queryMousePosition(): 
    
         pt = POINT() 
         windll.user32.GetCursorPos(byref(pt)) 
         return {"x": pt.x,"y": pt.y} 
    
        pos = queryMousePosition() 
    
        print('{{\'x\': {}, \'y\': {}}}'.format(pos['x'],pos['y']),st) 
    
    #printevery100ms() # HERES ISSUE NUMBER 2 
    
    
    if __name__ == '__main__': 
    
         # Start printevery100ms as a process 
         p = multiprocessing.Process(target=printevery100ms, name="printevery100ms", args=()) # FIXED ISSUE NUMBER 2 
         p.start() 
    
         # Wait 10 seconds for printevery100ms 
    
         time.sleep(10) 
         # Terminate printevery100ms 
         p.terminate() 
    
         p.join() 
         print("Not Terminated") 
    
    : 여기

은 수정입니다

관련 문제