在我的代码中,我有两个函数,第一个函数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]
在多处理程序包中是否有任何解决方案可以让我保留这种形式的代码。如果没有,是否有其他解决方案?
答案 0 :(得分:1)
首先,您真的要在这里进行多处理而不是多线程吗? 您要求替代解决方案,因此,我针对此问题提出了多线程解决方案。您应该检查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)