我想在后台使用vosk录制语音,而在主线程中,我仍然在不停止脚本的情况下读取超声波传感器的值,但是当我尝试这样做时,线程无法异步运行
t8e9dugd1#
Python对线程和协程有很好的支持,这非常适合I/O密集型任务,例如,一个任务可以等待Web响应,而另一个任务可以发出其他请求或查询数据库。对于CPU密集型的工作,你可以认为多线程是利用多核处理器的一个很好的工具,这通常对操作系统来说是正确的,操作系统可以在不同的内核上执行不同的线程。(至少是比较常见的解释器),在一个进程中只能同时执行一个线程。这是因为GIL(全局解释器锁)。因此,进程Python(例如,运行解释器的进程)不能使用多个内核来运行不同的线程。Vosk转录是CPU密集型任务,因此您无法利用多线程的多核优势。这并不意味着操作系统停止在线程之间切换,只是您感觉不到性能的提高。解决方案是利用多处理。你可以在this project中看到如何使用vosk的进程池来并行化任务。在代码中我处理mp3文件,但是在多个进程中处理来自不同麦克风的音频帧会很容易,而其他进程则做其他令人兴奋的事情。它们之间的通信可以通过多处理队列来完成。管道或管理器对象(队列也可以)。
1条答案
按热度按时间t8e9dugd1#
Python对线程和协程有很好的支持,这非常适合I/O密集型任务,例如,一个任务可以等待Web响应,而另一个任务可以发出其他请求或查询数据库。
对于CPU密集型的工作,你可以认为多线程是利用多核处理器的一个很好的工具,这通常对操作系统来说是正确的,操作系统可以在不同的内核上执行不同的线程。(至少是比较常见的解释器),在一个进程中只能同时执行一个线程。这是因为GIL(全局解释器锁)。因此,进程Python(例如,运行解释器的进程)不能使用多个内核来运行不同的线程。
Vosk转录是CPU密集型任务,因此您无法利用多线程的多核优势。这并不意味着操作系统停止在线程之间切换,只是您感觉不到性能的提高。
解决方案是利用多处理。你可以在this project中看到如何使用vosk的进程池来并行化任务。在代码中我处理mp3文件,但是在多个进程中处理来自不同麦克风的音频帧会很容易,而其他进程则做其他令人兴奋的事情。它们之间的通信可以通过多处理队列来完成。管道或管理器对象(队列也可以)。