【发布时间】:2022-06-12 08:33:53
【问题描述】:
我目前正在开发一个使用两个摄像头的计算机视觉项目,我想通过使用多个线程、进程或 asyncio 来提高程序的速度,但我的经验有限,我不知道如何重写程序的架构,也许你可以给我一些建议,
程序主要使用tkinter opencv和numpy,从两个摄像头读取数据,然后根据获取的数据计算一个结果
这是最小运行示例:
class gui():
def __init__(self,args):
some_layout...
self.root = tk.Tk()
self.get_data_from_Cam1()
self.root.mainloop()
def get_data_from_Cam1(self):
..read frame from cam 1..
self.job = self.root.after(1, self.process_Cam1ata())
def process_Cam1ata(self):
..process_Cam1ata ,You can assume it is an OCR operation..
self.job = self.root.after(1, self.get_data_from_Cam2())
def get_data_from_Cam2(self):
..read frame from cam 1..
self.job = self.root.after(1, self.process_Cam2Data())
def process_Cam2Data(self):
..process_Cam2ata.. #High computational capacity
self.job = self.root.after(1, self.show_result_on_gui())
def show_result_on_gui(self):
..show result..
self.job = self.root.after(1, self.get_data_from_Cam1())
另外我想问一下tkinter的'after'函数是不是异步操作?
【问题讨论】:
-
“另外我想问一下 tkinter 的 'after' 函数是不是异步操作?”
after只是将要完成的工作放在队列中。这项工作最终与所有其他 GUI 代码在同一个线程中运行。 -
FWIW,您的代码实际上并没有使用
after来达到任何效果。after(1, foo())将立即运行foo(),然后将结果传递给after。 -
如果您需要做不阻塞 GUI 的工作,那么您需要生成一个线程。线程涉及线程之间的通信。最好用队列来完成。
-
你真的需要进程——而不是线程! - 每个摄像头一个,一个用于 GUI。进程间通信需要小心。我还没有遇到这个行之有效的队列。套接字真的工作得很好并且高度优化。
-
@jwal 非常感谢你的建议,我试过Sockets,真的很适合我的工作,非常简单优雅的多进程解决方案
标签: python multithreading tkinter python-asyncio