在我的代码中,我有两个函数,第一个函数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]


多处理程序包中是否有任何解决方案可以让我保留这种形式的代码。如果不是,是否有其他解决方案可以解决此问题?

最佳答案

首先,您真的要在这里进行多处理而不是多线程吗?
您要求替代解决方案,因此,我针对此问题提出了多线程解决方案。您应该检查this answer为清晰起见,其中大多数讨论了相同的问题。因此,我认为问题在于您的打印功能仅执行一个功能,因此您还希望在其中执行循环。

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)

关于python - 如何使用多处理python更新和检索图像?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53962116/

10-13 04:14