如何避免Python多进程spawn模式加载修改后的脚本?
问题分析
使用spawn模式启动多进程时,每次创建子进程都会重新启动Python解释器、导入并执行主脚本文件,因此修改脚本并保存后,新启动的子进程会加载最新的代码版本,导致运行逻辑变化甚至崩溃。而fork模式是直接复制父进程内存空间,不会重新读取脚本文件,因此不受修改影响。
解决方案
以下是三种在spawn模式下安全编辑代码、不影响后台进程的实现方式:
方案1:固化子进程逻辑为字符串传递
将需要稳定运行的函数逻辑以字符串形式定义在主进程中,子进程通过执行这段字符串运行逻辑,而非从脚本文件读取。后续修改脚本文件时,子进程仍会执行启动时确定的代码。
import time import multiprocessing # 固化子进程要执行的逻辑代码 WORKER_LOGIC = """ def print_something(): print("1") """ def run_worker(logic_code): # 执行传递的逻辑代码,定义目标函数 exec(logic_code) # 调用函数 print_something() def main(): multiprocessing.set_start_method('spawn') while True: # 传递固化的逻辑代码给子进程 process = multiprocessing.Process(target=run_worker, args=(WORKER_LOGIC,)) process.start() process.join() time.sleep(1) if __name__ == "__main__": main()
方案2:动态捕获启动时的函数源代码
借助inspect模块在主进程启动时捕获目标函数的源代码,再传递给子进程执行,确保子进程始终使用启动时的代码版本。
import time import multiprocessing import inspect def print_something(): print("1") def run_worker(source_code): exec(source_code) print_something() def main(): multiprocessing.set_start_method('spawn') # 启动时捕获目标函数的源代码 worker_source = inspect.getsource(print_something) while True: process = multiprocessing.Process(target=run_worker, args=(worker_source,)) process.start() process.join() time.sleep(1) if __name__ == "__main__": main()
方案3:拆分核心逻辑到独立模块
将需要稳定运行的函数放到单独的模块文件中,主脚本仅负责启动子进程调用该模块的函数。只要不修改这个独立模块,后续编辑主脚本不会影响子进程的执行逻辑。
- 创建
stable_worker.py文件:
def print_something(): print("1")
- 主脚本代码:
import time import multiprocessing import stable_worker def main(): multiprocessing.set_start_method('spawn') while True: process = multiprocessing.Process(target=stable_worker.print_something) process.start() process.join() time.sleep(1) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者XiozZe
相关产品推荐
相关产品推荐

