1

私はマウス座標(x、y)とタイムスタンプをすべて100msと出力しています。 を10秒間実行したい。それでおしまい。なぜ私のPythonコードは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. if __name__ == '__main__':(右30行目)の前にprintevery100ms()が呼び出され、メインスレッドでその関数が実行されても停止しないという問題があります。
  3. multiprocessing.Processを呼び出すと、引数が(10、)のprintevery100msが呼び出され、この呼び出しが失敗します。しかし、メインスレッドはまだ実行しているので、停止しているようには見えません。ここで

は修正だ:

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") 
関連する問題