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. Я предполагаю, что это проблема: 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")