【发布时间】:2019-02-19 12:13:49
【问题描述】:
我有一个无限循环,从网络摄像头读取视频帧,每一帧都将通过一个需要高计算能力的复杂函数。因此,当显示帧时,由于阻塞代码,程序会感觉有点迟钝。
我现在打算做的是,
- 只收集目标对象出现时的前几帧
- 将它们放到一个单独的线程中以避免代码阻塞。
我测量了网络摄像头每秒捕获的帧数,大约为 28 帧。所以每秒while循环只会收集前5帧并在另一个线程中处理它们,并在所有5个函数完成后返回结果。
我尝试使用“Pool”和“Queue”但无法正常工作,循环仍然被阻塞。下面的代码模糊地代表了我的程序现在的样子,我回家后将对其进行编辑,现在使用电话发布。
def detect(frame):
# detect target object from images
pass
def nn(frame):
# some heavy processing code
pass
count = 0
stack = []
while True:
frame = cv2.imread(0)
detected = detect(frame)
# stop collecting images when collected 5
if detected and count <= 5:
stack.append(frame)
count += 1
# start processing
if len(stack) == 5:
p = Pool(4)
results = p.map(nn, frame)
p.close()
p.join()
# reset
stack = []
count = 0
我的概念正确吗?或者我需要做一些其他的事情,比如协程?
【问题讨论】:
-
尝试使用多处理。这是我使用 ping 制作的一个简单示例(请阅读我在 cmets 中关于 CPU 绑定任务的注释):gist.github.com/ltpitt/6cdcb5377c462445a315703c5062397c
-
我明白了。我会更新帖子:)
标签: python loops asynchronous python-multithreading coroutine