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

如何每30分钟重复运行multiprocessing.Process?循环执行异常排查

问题解决指南

一、循环仅执行一次的原因与修复

你的循环只跑一轮就停,核心问题是文件对象ipfile的读取指针耗尽:
第一次执行for hostname in ipfile时,文件指针会移动到文件末尾,第二次外层循环再遍历ipfile时,已无剩余内容可读取,内层循环直接跳过,没有启动任何进程,后续逻辑自然无法触发。

修复方案:
提前把所有IP读取到内存列表中,避免重复操作文件指针:

# 先一次性读取所有IP到列表(替换成你的IP文件路径)
with open("ip_list.txt", "r") as f:
    ip_list = [line.strip() for line in f if line.strip()]

# 外层循环改用ip_list遍历
for n in range(5):
    print(f"\nStart of Round {n + 1}:")
    process_list = []
    for ip in ip_list:
        process = multiprocessing.Process(target=connector, args=(ip, username, password))    
        process_list.append(process)
        process.start()
        time.sleep(2)
    # 初始化process_alive,避免空列表导致的未赋值问题
    process_alive = 1 if process_list else 0
    while process_alive == 1:
        try:
            # 简化存活判断逻辑,无需手动构建列表
            process_alive = any(p.is_alive() for p in process_list)
            time.sleep(1)  # 加短休眠,避免CPU空转
        except KeyboardInterrupt:
            for p in process_list:
                if p.is_alive():
                    p.terminate()
            break  # 中断后退出循环
    print(f"\nEnd of Round {n + 1}:")
    time.sleep(1800)  # 30分钟=1800秒,原代码的30是30秒,注意修正!

二、封装函数时UnboundLocalError的修复

出现该错误是因为process_alive变量在某些代码路径下未赋值就被引用:
比如如果ip_list为空,内层循环未执行,process_alive未定义就进入while循环;或是函数内变量作用域问题,Python会将赋值过的变量视为局部变量,若在赋值前引用就会触发错误。

修复方案:
在函数内提前初始化process_alive,确保所有路径下变量都有定义:

import multiprocessing
import time

def poll_devices(username, password, ip_list, rounds=5):
    for n in range(rounds):
        print(f"\nStart of Round {n + 1}:")
        process_list = []
        for ip in ip_list:
            process = multiprocessing.Process(target=connector, args=(ip, username, password))    
            process_list.append(process)
            process.start()
            time.sleep(2)
        # 提前初始化process_alive,避免未赋值就引用
        process_alive = any(p.is_alive() for p in process_list)
        while process_alive:
            try:
                process_alive = any(p.is_alive() for p in process_list)
                time.sleep(1)
            except KeyboardInterrupt:
                for p in process_list:
                    if p.is_alive():
                        p.terminate()
                break
        print(f"\nEnd of Round {n + 1}:")
        time.sleep(1800)

# 必须在if __name__ == "__main__"下启动多进程,避免递归启动问题
if __name__ == "__main__":
    with open("ip_list.txt", "r") as f:
        ip_list = [line.strip() for line in f if line.strip()]
    poll_devices("your_username", "your_password", ip_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:17:01