Как мне обновить и получить изображение, используя многопроцессорный Python? - PullRequest
0 голосов
/ 28 декабря 2018

В моем коде у меня есть две функции, первая функция operate_camera обновляет переменную хранения.Вторая функция print_func печатает переменную хранения.

Я хотел бы запустить эти две функции одновременно, так как процесс печати происходит с задержкой в ​​15 секунд.Однако функция operate_camera содержит цикл while.И, запустив сценарий, он запустит процесс p2 один раз и останется в процессе p1.

. Для простоты я работаю с простыми одномерными массивами в следующем коде.

from multiprocessing import Process, Array 
import numpy as np 
import time

def operate_camera(store):
    while True: # loop that updates image
        store = store + np.ones_like(store)

def print_func(store):
    print(store)
    time.sleep(15)

if __name__ == "__main__":
    store = np.array([0,0,0])

    p1 = Process(target=operate_camera, args=(store,))
    p2 = Process(target=print_func, args=(store,))

    p1.start()    
    p2.start()

Вывод будет просто зависнуть на

[0,0,0]

Существуют ли какие-либо решения в составе многопроцессорного пакета, которые могут позволить мне сохранить эту форму кода.Если нет, есть ли альтернативные решения этой проблемы?

1 Ответ

0 голосов
/ 28 декабря 2018

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

from threading import Thread
import numpy as np
import time

store = np.array([0, 0, 0])


def operate_camera():
    while True:
        global store
        store += np.ones_like(store)


def print_func():
    while True:
        time.sleep(15)
        print(store)


if __name__ == "__main__":

    t1 = Thread(target=operate_camera)
    t2 = Thread(target=print_func)

    t1.start()
    t2.start()

    # other code

    t1.join()
    t2.join()

Вы можете заметить, что этот код использует глобальный объект, который не является лучшей практикой, нонам нужен общий объект там.

В случае функций с параметрами

from threading import Thread
import numpy as np
import time


def operate_camera(store):
    while True:
        store += np.ones_like(store)


def print_func(store):
    time.sleep(1)
    print(store)


if __name__ == "__main__":
    store = np.array([0, 0, 0])

    camera_thread = Thread(target=operate_camera, args=(store, ))
    camera_thread.setDaemon(True)
    camera_thread.start()

    while True:
        print_func(store)
...