如何在Python中运行exec() 5秒后终止执行?
解决exec()执行用户脚本超时终止的问题
首先,你用threading搞不定是因为Python的线程没法被安全强制终止——强行终止线程可能会导致资源泄漏、锁死等各种bug。用多进程(multiprocessing)才是靠谱的方案,因为进程是独立的,可以安全杀死,不会影响主进程。
下面是具体实现代码:
import multiprocessing import time def run_user_code(user_code, global_vars=None): # 执行用户代码,可传入指定的全局变量字典做权限限制 exec(user_code, global_vars or {}) def execute_with_timeout(user_code, timeout=5): # 创建子进程执行用户代码 process = multiprocessing.Process(target=run_user_code, args=(user_code,)) process.start() # 等待指定超时时间 process.join(timeout) # 如果进程仍在运行,强制终止并清理 if process.is_alive(): process.terminate() process.join() # 确保进程彻底退出 print("用户脚本因超时被终止") else: print("用户脚本正常执行完成") # 测试用例:无限循环的用户代码 user_code = """ while True: print("循环中...") time.sleep(1) """ execute_with_timeout(user_code)
关键细节说明:
- 多进程的优势:子进程与主进程完全隔离,终止操作不会留下资源泄漏、未释放锁等隐患,这是线程方案做不到的。
- 权限控制:如果需要限制用户脚本的访问范围,可以在
run_user_code中传入自定义的global_vars字典,只开放允许的模块或变量,避免用户访问敏感资源。 - 进程清理:调用
terminate()后必须再执行join(),确保进程彻底退出,释放系统资源。
额外补充:
如果需要获取用户脚本的执行结果,可以用multiprocessing.Queue或Pipe在主进程和子进程间传递数据,注意传递的数据必须是可序列化的。
内容的提问来源于stack exchange,提问作者Mork Shmork
相关产品推荐
相关产品推荐

