Android Kotlin通过Chaquopy运行AudioCompare脚本遇多进程相关错误
解决Chaquopy运行AudioCompare的多进程相关错误
问题根源
Android系统不支持sem_open系统调用,导致原生multiprocessing模块无法正常初始化,抛出OSError;切换到multiprocessing.dummy(线程模拟多进程)后,由于该模块未实现cpu_count方法,AudioCompare代码调用该方法时触发AttributeError。
解决方案
方案1:给multiprocessing.dummy补充cpu_count实现
在你的Python入口脚本(比如main.py)的最顶部添加以下代码,要在导入AudioCompare或任何依赖multiprocessing的模块之前执行:
import os import multiprocessing.dummy as multiprocessing # 给dummy模块添加cpu_count方法,复用os模块的实现 multiprocessing.cpu_count = lambda: os.cpu_count() or 1
这样AudioCompare调用multiprocessing.cpu_count()时,会使用我们补充的逻辑,返回设备的CPU核心数(或默认1)。
方案2:直接修改AudioCompare的Matcher.py代码
找到Matcher.py中调用multiprocessing.cpu_count()的代码块,将其替换为基于os模块的实现:
原代码(示例):
import multiprocessing worker_count = multiprocessing.cpu_count()
修改为:
import os worker_count = os.cpu_count() or 1
同时将Matcher.py中的import multiprocessing替换为import multiprocessing.dummy as multiprocessing,确保用线程池替代进程池。
额外注意事项
multiprocessing.dummy是线程级别的模拟,所有线程共享同一内存空间,若AudioCompare中存在进程间通信逻辑(如Pipe、Queue),dummy版本的对应组件是线程安全的,无需额外修改。- 如果AudioCompare还依赖其他多进程特有的API(如
Process类的某些属性),需要逐一替换为dummy模块的对应实现,或调整为线程兼容的逻辑。
内容的提问来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

