1

Ich habe einen Code, der Mauskoordinaten (x, y) und Zeitstempel alle 100ms ausdrucken. Ich will es für 10 Sekunden laufen. Das ist es.Warum läuft mein Python-Code auch nach 10 Sekunden weiter?

So implementiert I „Multiprozessing“ und ich initialisiert es die Hauptfunktion aus dem Inneren der Multiprocessing Funktion „printevery100ms“ zu nennen, und ich sagte es nach 10 Sekunden herunterzufahren.

Aber statt Schließung nach 10 Sekunden gedrückt, springt er über die p.terminate() Befehl und hält läuft und läuft ...

Hier ist der Code ist.

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" 

So ist der Multiprocessing Code initialisiert die 10-Sekunden-Timer und es soll es nach 10 Sekunden herunterzufahren, die der Zweck des Befehls terminate ist. Ich habe einen Druckbefehl geschrieben, um "Nicht beendet" auszudrucken, wenn der Code auch nach 10 Sekunden nicht stoppt; Genau das ist passiert. Hier

ist das Ergebnis: (nach 9 Sekunden ..)

("{'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') 

Wie Sie sehen können sie Druck „nicht beendet“, was bedeutet, dass es 10 Sekunden lang läuft und es an denen die beenden Befehl, aber läuft weiter, als ob nichts passiert wäre. Kannst du mir bitte sagen, was ich falsch mache oder ob das etwas mit Multi-Processing zu tun hat?

Antwort

0

Es gibt ein paar Probleme mit Ihnen Code:

  1. Aus Stil Perspektive, die Sie haben unterschiedliche Einzüge in der printevery100ms Funktion.
  2. Ich vermute, das ist das Problem: printevery100ms() heißt vor Ihrer if __name__ == '__main__': (rechts über Zeile 30) und führt die Funktion in Ihrem Haupt-Thread und das hört nicht auf.
  3. Der Anruf an multiprocessing.Process ruft printevery100ms mit einem Argument von (10,) auf, was dazu führt, dass dieser Aufruf fehlschlägt. Sie haben jedoch immer noch den Haupt-Thread ausgeführt, so dass es nicht so aussieht, als ob es aufhört.

Hier ist der fix:

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") 
Verwandte Themen