【debug】报错RuntimeError: can‘t start new thread解决

🚀Debug专栏

       其他debug记录请参考上方【debug专栏】


目录

🚀Debug专栏

🍭🍭背景

❓❓问题

🙋🙋解决方案

1.cpu线程数降低

2.数据增广

至此问题就解决了😎😎

整理不易,欢迎一键三连!!!


🍭🍭背景

        跑PyTorch 的深度学习的代码,之前跑没有问题,换了一台服务器,遇到这个bug报错:RuntimeError: can't start new thread,原因是测试的时候线程开得太多了,导致软件开始,不再能够被处理,卡死。

❓❓问题

        详细报错信息[ERROR:0] global /tmp/pip req build cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 160: Can't spawn new thread: res = 11循环很多次,
如下所示:


[ERROR:0] global /tmp/pip-req-build-cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 158: Can't spawn new thread: res = 11
[ERROR:0] global /tmp/pip-req-build-cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 120: Can't spawn new thread: res = 11
[ERROR:0] global /tmp/pip-req-build-cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 152: Can't spawn new thread: res = 11
[ERROR:0] global /tmp/pip-req-build-cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 159: Can't spawn new thread: res = 11
[ERROR:0] global /tmp/pip-req-build-cg56sov1/opencv/modules/core/src/parallel_impl.cpp (24
0) WorkerThread 160: Can't spawn new thread: res = 11


...


RuntimeError: can't start new thread

🙋🙋解决方案

1.cpu线程数降低

        可以尝试将num_work调小,即调小mmseg工程里的config文件中workers_per_gpu参数。

        代码如下:

data = dict(
    samples_per_gpu=4,  #batch_size
    workers_per_gpu=1,  #num_work
    train=dict(...)
    )

2.数据增广

        albumentations库中所使用的基于opencv的各种数据变换占用了太多的cpu,因此需要调小opencv的线程数目在训练最开始的时候加入以下两行。

        代码如下:

import cv2
cv2.setNumThreads(1)	# 0也可以

至此问题就解决了😎😎

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

import os import time import speech_recognition as sr import pyttsx3 from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.label import Label from kivy.core.window import Window from kivy.clock import Clock from threading import Thread from plyer import notification # 新增通知模块 class VoiceAssistantApp(App): def build(self): self.title = "语音控制助手" self.layout = BoxLayout(orientation='vertical', spacing=10, padding=20) # 语音反馈 self.engine = pyttsx3.init() self.engine.setProperty('rate', 150) # 优化语速 # 录音控制 self.recording = False self.recognizer = sr.Recognizer() # 移动端适配 Window.size = (360, 640) # 设置默认分辨率 self.layout.bind(minimum_height=self.layout.setter('height')) # 界面组件 self.status_label = Label(text="等待指令...", size_hint_y=None, height=50) self.command_label = Label(text="识别结果:", size_hint_y=None, height=50) self.start_button = Button(text="开始录音", size_hint=(1, None), height=60) self.stop_button = Button(text="停止录音", size_hint=(1, None), height=60) # 添加交互 self.command_label.bind(size=self.command_label.setter('text_size')) self.layout.add_widget(self.status_label) self.layout.add_widget(self.command_label) self.layout.add_widget(self.start_button) self.layout.add_widget(self.stop_button) return self.layout def speak(self, text): """语音反馈""" self.engine.say(text) self.engine.runAndWait() # 新增通知功能 notification.notify(title="语音助手", message=text, timeout=3) def start_recording(self, instance): """开始录音线程""" if not self.recording: self.recording = True self.status_label.text = "正在录音..." Thread(target=self.listen_for_command).start() def stop_recording(self, instance): """停止录音""" self.recording = False self.status_label.text = "等待指令..." def listen_for_command(self): """监听语音指令""" with sr.Microphone() as source: self.recognizer.adjust_for_ambient_noise(source) audio = self.recognizer.listen(source) try: # 使用Google语音识别API command = self.recognizer.recognize_google(audio, language='zh-CN') self.command_label.text = f"识别结果:{command}" self.execute_command(command) except sr.UnknownValueError: self.command_label.text = "识别失败,请重试" self.speak("抱歉,我没听懂,请重试") except sr.RequestError: self.command_label.text = "网络错误" self.speak("网络连接失败") def execute_command(self, command): """执行指令""" command = command.lower() # 示例指令(可扩展) if "打开浏览器" in command: self.speak("正在打开浏览器") os.system("am start -a android.intent.action.VIEW -d https://www.baidu.com") elif "播放音乐" in command: self.speak("正在播放音乐") os.system("mpg321 ~/Music/song.mp3 &") # 使用跨平台播放器 elif "关闭手机" in command: self.speak("正在关闭手机") os.system("adb shell input keyevent 26") # 通过ADB模拟按键 else: self.speak("抱歉,我暂时无法执行这个操作") self.command_label.text += "(无匹配指令)" if __name__ == '__main__': VoiceAssistantApp().run() 打包一下这个软件
最新发布
03-22
<think>嗯,用户让我打包他们提供的Python语音助手代码。我需要先理解代码的结构和依赖,然后考虑如何打包成可执行文件,特别是移动端可能需要APK,但Python打包移动应用比较复杂。通常,Python应用打包工具有PyInstaller、cx_Freeze等,但移动端可能需要Kivy的官方工具或者BeeWare。 首先,用户代码中用了Kivy,所以应该使用Kivy的打包工具。比如,对于Android,可以用Buildozer。但用户可能是在桌面环境下运行,也可能需要移动端。不过代码里有移动端适配的设置,比如设置窗口大小,可能用户希望打包成Android应用。 接下来,我需要检查代码中的依赖:speech_recognition, pyttsx3, plyer, Kivy等。另外,像pyttsx3在Android上可能有问题,可能需要替换为其他库。不过用户可能只是想在桌面运行,所以可能没问题。 然后,打包步骤大致是:安装依赖,配置打包工具,生成spec文件或buildozer.spec,处理可能的依赖问题。比如,speech_recognition需要PortAudio,可能需要额外安装。但如果是用PyInstaller,可能需要添加hidden imports或者数据文件。 另外,用户代码中用到了os.system执行一些命令,比如am start,这在Android上有效,但在Windows上可能不行。所以如果目标是Android,可能需要调整这些命令,使用Android的API或者Kivy的特定实现。 可能的问题点:pyttsx3在Android上的兼容性,可能需要使用Kivy的TTS模块代替。还有,speech_recognition在移动端的麦克风访问权限需要配置。 所以,回答用户时应该分两种情况:桌面打包和Android打包。桌面用PyInstaller,Android用Buildozer,并指出可能的依赖问题和需要调整的代码部分。此外,需要提醒用户检查语音识别和TTS在目标平台的支持情况,以及可能的权限配置。 最后,给出具体的步骤,比如安装Buildozer,配置spec文件,处理依赖,然后打包。同时,提示用户如果遇到问题,可能需要调整代码或处理平台特定的问题。</think>我来帮您分析这个语音助手应用的打包流程,并给出分步指导: $\boxed{一、环境准备}$ 1. 安装依赖库: ```bash pip install kivy plyer speechrecognition pyttsx3 ``` 2. 添加移动端打包工具: ```bash pip install buildozer cython==0.29.32 # Android打包需要 ``` $\boxed{二、桌面端打包(Windows/Linux/Mac)}$ 1. 安装PyInstaller: ```bash pip install pyinstaller ``` 2. 创建打包配置文件: ```python # 在代码同目录创建main.spec文件 block_cipher = None a = Analysis(['main.py'], binaries=[], datas=[], hiddenimports=['pyttsx3.drivers','pyttsx3.drivers.dummy'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz,...) ``` 3. 执行打包命令: ```bash pyinstaller main.spec --onefile ``` $\boxed{三、Android打包(需Linux环境)}$ 1. 创建buildozer配置: ```bash buildozer init ``` 2. 修改buildozer.spec关键配置: ```ini [app] title = 语音助手 package.name = voiceassistant package.domain = org.example source.dir = . source.include_exts = py,png,jpg,kv requirements = python3, kivy, plyer, speechrecognition, pyttsx3, openssl [android] permissions = RECORD_AUDIO, INTERNET ``` 3. 执行打包命令: ```bash buildozer -v android debug ``` $\boxed{四、注意事项}$ 1. 语音识别适配: - Android需要添加麦克风权限 - Google语音服务需要网络连接 2. 平台差异处理: ```python # 修改执行命令部分 if platform == 'android': from jnius import autoclass Intent = autoclass('android.content.Intent') Uri = autoclass('android.net.Uri') PythonActivity = autoclass('org.kivy.android.PythonActivity') ``` 3. 语音引擎优化: ```python # 替换为跨平台兼容的TTS from plyer import tts tts.speak(message='您好') # 替代pyttsx3 ``` $\boxed{五、常见问题解决}$ 1. 如果遇到音频驱动错误: ```bash sudo apt-get install portaudio19-dev # Linux brew install portaudio # Mac ``` 2. 打包体积过大时: - 在.spec文件中排除不需要的库 - 使用UPX压缩工具 3. Android打包失败时: - 检查NDK/SDK路径配置 - 确保可用内存 > 4GB - 升级buildozer到最新版本 建议先在桌面端测试通过后再进行移动端打包。如果需要完整示例项目,我可以提供GitHub仓库地址供参考。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zy_destiny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值