Предположим, я должен отправить бит b
, созданный в момент t. Я должен отправить этот бит после задержки в "d". В течение этого времени задержки «d» должно прийти больше битов, и я должен взять среднее значение битов в интервале [t-0.5, t+0.5]
. Я создал планировщик в python, например:
import threading
import time
from time import sleep
running_schedular = []
CM2PIX = 30/720
OFFSETCM = 38
SPEED = 90/8.8
class Schedular:
def __init__(self, _time, _bits, _loc):
self.trigger_time = _time
self.trigger_bits = _bits
self.location = _loc
def process(self, _delay):
global running_schedular
sleep(_delay)
print("data sent: {} at {} ".format(self.trigger_bits, self.location))
# function to send bits
running_schedular.pop(self.location)
class SendingBits:
def setBits(self, _time, _bits):
global running_schedular
for i in range(len(running_schedular)):
sch = running_schedular[i]
if _time > sch.trigger_time - 0.5 and _time < sch.trigger_time + 0.5:
sch.trigger_bits = sch.trigger_bits | _bits
return
sch = Schedular(_time, _bits, len(running_schedular))
thread = threading.Thread(target=sch.process, args=(_time - time.time(),))
thread.start()
running_schedular.append(sch)
sendingBits = SendingBits()
while True:
_time = time.time()+ ((720-720/2)*CM2PIX + OFFSETCM)/SPEED
sendBits = 0 | 0x02
sendingBits.setBits(_time, sendBits)
Но приведенная выше программа не является потокобезопасной и выдает мне случайную ошибку:
Exception in thread Thread-61:
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "test.py", line 20, in process
running_schedular.pop(self.location)
IndexError: pop index out of range
Можете ли вы предложить мне как лучше решить эту проблему или предложить улучшения?