Я использую три функции ниже (queue_value_emptier
, step_emptier
и step_through
), чтобы измерить разницу между набором точек и сделать несколько небольших шагов между ними.
Существует еще два процесса, совместно использующих блокировку с функцией step_through
(последовательность камер и сохранение данных). Это связано с тем, что я не хочу, чтобы сохранение камеры / данных было доступно, когда значения изменяются, и наоборот.
def queue_value_emptier(self, queued_dict):
"""Recursively empty the queue values of the dict"""
if self.paused is True:
self.queue_value_emptier(queued_dict)
updated_dict = {}
for key, value in queued_dict.items():
new_val = value.get()
updated_dict[key] = new_val
self.update(updated_dict)
time.sleep(self.transition_time)
# Base case
if value.empty():
return
# Check paused
elif self.paused:
return
else:
# Recursion call
self.queue_value_emptier(queued_dict)
def step_emptier(self, step_list, nested_dict):
"""Iterating through each step"""
for step in step_list:
step_dict = nested_dict[step]
self.queue_value_emptier(step_dict)
return
def step_through(self, seg):
"""Select which segment to run"""
if seg is None:
# Here to start the process without actually starting anything
return
# When the segment is available
self.seg_selected = OrderedDict(self.segments[seg])
self.lock.acquire()
# Creating a nested dict with queue values
step_order = []
step_order, dynamic_dict = self.step.stepping_through(self.seg_selected, self.tcp.dynamic, self.step_size)
self.step_emptier(step_order, dynamic_dict)
self.lock.release()
Этот код работает именно так, как мне нужно. Проблема в том, что мне бы хотелось иметь возможность приостанавливать, возобновлять и останавливать линейное изменение значений в терминале, используя следующие функции:
def pause(self):
"""Freezes the state at it's current properties"""
self.paused = True
def resume(self):
"""Unfreezes the state and continues running the queue"""
self.paused = False
def stop(self):
"""Stop daemons"""
self.step_through('Stop') # Calls the stop sequence
# Ramping values to zero
self.paused = False
# Stopping threads
self.fpga.stop()
self.tcp.stop()
self.process.stop()
Я понял, что не могу получить доступ к этим функциям, потому что блокировка предотвращает все остальное. Я просто не могу на всю жизнь понять, как их обойти, потому что замок необходим.