Python Multiprocessing: остановить, приостановить, возобновить процесс с блокировкой - PullRequest
0 голосов
/ 17 мая 2019

Я использую три функции ниже (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()

Я понял, что не могу получить доступ к этим функциям, потому что блокировка предотвращает все остальное. Я просто не могу на всю жизнь понять, как их обойти, потому что замок необходим.

...