DoctorReid / ZenlessZoneZero-OneDragon

绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄
https://one-dragon.org/zzz/zh/home.html
940 stars 36 forks source link

[问题反馈] [通用] cmd_utils.py中子进程串行输出会导致父子进程死锁 #302

Open edsad122 opened 3 hours ago

edsad122 commented 3 hours ago

问题描述

子进程是串行输出执行结果缓存与错误结果缓存的,如果此时子进程错误结果缓存满了而执行结果缓存为空,就会出现子进程申请写入错误结果缓存、父进程申请消费执行结果缓存的死锁。

这或许就是为什么不更新pip会导致卡死的原因。

游戏截图

{2146A8AA-748F-4b82-8AAA-E2E5A54BFAB9} 卡死在 Requirement already satisfied: llvmlite==0.43.0 ....指令上了

运行日志

No response

你的建议

用线程修改一下就好了,我已经commit了。

改一下run_command函数就行了,参考如下:


result_str: str = ''

def read_pipe(pipe, log_func):
    nonlocal result_str
    for line in iter(pipe.readline, ''):
        line_strip = line.strip().strip('"')
        if len(line_strip) == 0:
            continue
        log_func(line_strip)
        if message_callback is not None:
            message_callback(line_strip)
        result_str = result_str + '\n' + line_strip

# 创建两个线程分别处理 stdout 和 stderr
stdout_thread = threading.Thread(target=read_pipe, args=(process.stdout, log.info))
stderr_thread = threading.Thread(target=read_pipe, args=(process.stderr, log.error))

# 启动线程
stdout_thread.start()
stderr_thread.start()

# 等待线程结束
stdout_thread.join()
stderr_thread.join()

# 等待子进程完成
process.wait()
DoctorReid commented 2 hours ago

感谢 可以直接提个pr