Обмен значениями между двумя процессами? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть скрипт python, написанный для python 2.7, работающий на моем Raspberry Pi. То, что я пытаюсь сделать, это двигаться вперед с моим шаговым двигателем и в то же время проверить, есть ли впереди квадрат. Чтобы эти вещи не мешали, я хочу переместить обработку изображения в ее собственный процесс и просто проверить, было ли изображение найдено, прежде чем предпринять дальнейшие шаги.

Это участвующие классы.

SharedImageDetectionValue:

class SharedImageDetectionValue(object):
    stored_has_position_found = False

    def get_has_position_found(self):
        return self.stored_has_position_found

    def set_has_position_found(self, new_value):
        self.stored_has_position_found = new_value
        return self.stored_has_position_found

ImageProcessor:

class ImageProcessor:
    def __init__(self):
        # constructor code

    def run(self, shared):
        # do image processing till found a square
        shared.set_has_position_found(True)

Stepper:

class Stepper(Observable):
    def __init__(self):
        # constructor code

    def run_until_stopped(self, shared):
        # some motor code
        while self.running:
            has_found = shared.get_has_position_found()
            print("[ StepperH ] Value has found: " + str(has_found))
            if not has_found:
                self.do_steps(0.0005)

ProcessManager:

class ProcessManager(BaseManager):
    pass

И я пытаюсь создать процесс с этим:

ProcessManager.register('SharedImageDetectionValue', SharedImageDetectionValue)
manager = ProcessManager()
manager.start()

shared = manager.SharedImageDetectionValue()
pool = Pool(1)

imgProcessor = ImageProcessor()
pool.apply_async(imgProcessor.run, args=(shared, ))

print("[ MAIN ] StepperH add to pool")
Stepper().run_until_stopped(shared)

В целях тестирования я непосредственно устанавливаю значение true в обработчике изображений, но в степпере оно остается False. Я также попытался добавить Stepper в пул, но мне показалось, что степпер не работал.

Также я попытался вызвать процессы через две вспомогательные функции, но с похожим эффектом:

def start_processing(passed_shared):
    ImageProcessor().run(passed_shared)

def start_moving_to_target_platform(passed_shared):
    StepperH().run_until_stopped(passed_shared)

Что я делаю не так?

1 Ответ

0 голосов
/ 17 мая 2018

Почему вы усложняете работу с пользовательскими менеджерами, когда хотите использовать только одно значение - и multiprocessing.Value существует именно для этого. Кроме того, нет смысла создавать пул процессов, если вы собираетесь использовать его только для запуска одного процесса.

Вы можете значительно упростить свой код как:

import ctypes
import multiprocessing

class ImageProcessor(multiprocessing.Process):

    def __init__(self, shared):
        super(ImageProcessor, self).__init__()
        self.shared = shared

    def run(self):
        # do image processing till found a square
        self.shared.value = True

class Stepper(Observable):

    def run_until_stopped(self, shared):
        while self.running:
            print("[ StepperH ] Value has found: {}".format(shared.value)
            if not shared.value:
                self.do_steps(0.0005)

    # rest of your Stepper code

if __name__ == "__main__":  # a multiprocessing guard
    shared = multiprocessing.Value(ctypes.c_bool, False)

    img_processor = ImageProcessor(shared)
    img_processor.start()

    Stepper().run_until_stopped(shared)

Без ущерба для какой-либо существующей функциональности.

...