You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python后台守护进程无法顺序处理文件请求问题求助

解决守护进程逐个处理文件任务的问题

你的代码存在两个核心问题导致无法按预期逐个处理文件:

  1. 进程隔离导致任务无法传递:每次执行add命令时会启动全新的Python进程,该进程的Test实例与运行中的守护进程完全独立,新添加的文件根本无法进入守护进程的任务队列。
  2. 列表遍历与修改冲突:即便在同一进程中,worker方法里for i in self.listfiles循环同时执行self.listfiles.remove(i),会因列表结构变化导致遍历跳过元素,无法保证逐个处理。

修复方案

核心思路

改用文件持久化任务队列实现进程间通信,让守护进程定期读取任务文件,严格逐个处理任务;add命令仅负责向任务文件追加路径,无需启动新的守护进程。

重构后的代码

import time
import daemon
import sys
import os
import mig_file
from pathlib import Path

class Test:
    def __init__(self):
        self.running = False
        # 定义任务文件与PID文件路径
        self.task_file = Path('/DAEMON_TEST/versions/files/tasks.txt')
        self.pid_file = Path('/DAEMON_TEST/versions/files/daemon.pid')
        # 确保目录存在
        self.task_file.parent.mkdir(parents=True, exist_ok=True)

    def run_daemon(self):
        # 写入PID文件
        with open(self.pid_file, 'w') as f:
            f.write(str(os.getpid()))
        self.worker()

    def worker(self):
        self.running = True
        while self.running:
            # 读取并处理任务
            if self.task_file.exists():
                # 一次性读取所有任务并清空文件(避免重复处理)
                with open(self.task_file, 'r+') as f:
                    tasks = [line.strip() for line in f if line.strip()]
                    f.seek(0)
                    f.truncate()
                
                # 严格逐个处理任务,完成一个再处理下一个
                for task in tasks:
                    try:
                        mig_file.main_test(task)
                    except Exception as e:
                        # 可选:失败任务可重新写入文件或记录日志
                        print(f"处理文件 {task} 失败: {e}", file=sys.stderr)
            # 短休眠减少CPU占用
            time.sleep(1)
        self.running = False

    def add_task(self, file_path):
        # 向任务文件追加新路径
        with open(self.task_file, 'a') as f:
            f.write(f"{file_path}\n")

    def stop_daemon(self):
        if self.pid_file.exists():
            with open(self.pid_file, 'r') as f:
                pid = int(f.read().strip())
            os.kill(pid, 15)
            self.pid_file.unlink()

    def main_root(self):
        if len(sys.argv) < 2:
            print("用法: python script.py [start|stop|add] [file_path]")
            sys.exit(1)
        
        cmd = sys.argv[1]
        if cmd == 'stop':
            self.stop_daemon()
        elif cmd == 'start':
            with daemon.DaemonContext():
                self.run_daemon()
        elif cmd == 'add':
            if len(sys.argv) <3:
                print("add命令需要指定文件路径")
                sys.exit(1)
            self.add_task(sys.argv[2])
        else:
            print("无效命令,支持: start|stop|add")
            sys.exit(1)

if __name__ == "__main__":
    ob = Test()
    ob.main_root()

关键改进点

  • 任务持久化:用文件存储待处理任务,彻底解决进程隔离无法共享内存队列的问题。
  • 严格顺序处理:读取任务后通过for task in tasks循环逐个执行处理逻辑,确保一个任务完成后再启动下一个。
  • 避免遍历冲突:一次性读取并清空任务文件,不再直接修改内存列表,消除遍历异常。
  • CPU资源优化:worker循环中加入time.sleep(1),避免空轮询占用过多CPU。

使用步骤

  1. 启动守护进程:python your_script.py start
  2. 批量添加任务:多次执行python your_script.py add /path/to/file添加多个文件
  3. 停止守护进程:python your_script.py stop

内容的提问来源于stack exchange,提问作者develop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:15:00