Как сохранить работоспособность основного цикла после многопроцессорной обработки процесса - PullRequest
0 голосов
/ 21 октября 2019

Моя основная функция запускает бесконечный цикл while, который идентифицирует объекты, присваивая объекту число. Эта петля не должна быть заблокирована. В зависимости от значения этого числа отдельный процесс должен опрашивать эту переменную в цикле while, который выходит только на определенное значение переменной.

Я пытался использовать многопроцессорную обработку для этой задачи опроса. Но новый процесс при запуске, по-видимому, останавливает основной цикл, так что номер объекта не изменяется. Чтобы избежать проблем с областью действия переменной, я устанавливаю GPIO-вывод равным 0 или 1 в основном цикле при обнаружении определенного объекта. GPIO-вывод считывается в цикле while внутри запущенного процесса, но остается неизменным при изменении объекта.

Как сохранить основной цикл while во время работы процесса?

def input_polling():
    print(rpigpio.input(Pi_kasse)," ..................")
    condition=True
    while condition:
        print(RPi.GPIO(12))
def main(args):
....
    inThread=multiprocessing.Process(target=input_polling,args=[])
....
    while True:
        print("311")
        inThread=multiprocessing.Process(target=input_polling,args=[])
        inThread.start()  
....
    If object==3
        Rpi.GPIO.output(Object,Low)
    else
        Rpi.GPIO.output(Object,HIGH)
    inThread.terminate()
    inThread.join()

if __name__ == '__main__':
    sys.exit(main(sys.argv))

1 Ответ

0 голосов
/ 22 октября 2019

Вы должны использовать очереди для передачи вашей переменной в ваш подпроцесс. И в этом процессе используйте значение «стоп» в качестве дозорного.

import multiprocessing as mp

def input_polling(in_queue):
    print(rpigpio.input(Pi_kasse)," ..................")
    # polls the input queue and stops when "STOP" is send
    # will block until element becomes available
    for a in iter(in_queue.get, 'STOP'): 
        print("Doing stuff")

def main(args):
....
    in_queue = mp.Queue()
    inThread=multiprocessing.Process(target=input_polling,args=[in_queue])
    inThread.start()  
    while True:
        print("311")

....
        If object==3
            in_queue.put(your_number)

    # when done put 'STOP' into queue and wait for process to terminate
    in_queue.put('STOP')
    inThread.terminate()
    inThread.join()

if __name__ == '__main__':
    sys.exit(main(sys.argv))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...