如何每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
相关产品推荐
相关产品推荐

