Я знаю на основе этой ссылки , что код для реализации Event (). Wait отличается, но я не думаю, что это должно учитывать большую разницу в эти времена.
У меня есть приложение, которое отправляет позиционные пакеты с частотой 60 Гц (каждые 0,0166666666667 с), приложение, получающее эти пакеты, предсказывает следующие позиции на основе скорости объектов. Когда время выравнивается, объект на другом конце уже находится в отправляемой позиции, поэтому визуального перехода в позицию нет. Это происходит в Python 2, но не в 3. Python 3.8.2 слишком долго ожидает отправки следующего пакета в потоке, и объект в другом приложении превысил отправляемую позицию.
class taskThread(threading.Thread):
def __init__(self, interval=None):
'''
Initializer function:
interval - The time interval to repeate calls to the 'task' function.
'''
super(taskThread, self).__init__()
self._finished = threading.Event()
self._interval = float(interval)
def setInterval(self, interval):
self._interval = float(interval)
def shutdown(self):
self._finished.set()
def run(self):
while True:
if self._finished.isSet():
return
tnow = time.time()
self.task()
self._finished.wait(self._interval - (time.time() - tnow))
print(time.time() - tnow)
def task(self):
'''
The task function.
Derived classes must implement this function.
'''
raise Exception('Task must be implemented!')
def __enter__(self):
self.start()
return self
def __exit__(self, type, value, traceback):
self.shutdown()
return True
Python 2.7.0 последовательно печатает:
0.0169999599457
0.0169999599457
0.0170001983643
0.0169999599457
0.0169999599457
0.0169999599457
0.0169999599457
0.0169999599457
Python 3.8.2 ждет намного дольше
0.031026363372802734
0.0320279598236084
0.031026363372802734
0.031026840209960938
0.031527042388916016
0.031026601791381836
0.03103041648864746
0.03302431106567383
Я что-то делаю неправильно для Python 3?