问题描述
我在研究环境下跑代码~
代码运行的时间非常长~超过10分钟~
这时候突然死机停电掉线了~
我的代码是否还在运行?
解决方案
核心解答
是的,您的代码大概率还在云端服务器上继续运行。
聚宽(JoinQuant)的研究环境是基于云端服务器的 Jupyter Notebook 架构。您的本地电脑(浏览器)只是一个发送指令和接收显示结果的“显示器”。当您点击运行代码后,计算任务就已经提交到了聚宽的云端服务器(Kernel)上执行。
因此,本地电脑的死机、停电、断网或关闭浏览器,都不会直接中断云端服务器上正在执行的代码。
需要注意的几个关键点
虽然代码在云端继续运行,但您需要注意以下几种情况,它们可能会影响您最终获取结果:
1. 无法看到实时的 Print 输出
当您重新启动电脑并恢复网络,再次打开该研究环境的 Notebook 时,您可能无法在原来的代码块(Cell)下方看到断网期间产生的实时 print 输出。因为前端与后端的连接曾被断开,输出流可能丢失。
2. 平台的资源限制与超时机制
虽然本地断网不影响,但聚宽平台对研究环境的资源是有严格限制的:
- 内存限制:如果您的代码在长时间运行中占用了过大的内存(例如超过 3G),系统会触发 OOM(Out of Memory)保护,强制杀死您的进程。
- 超时限制:平台为了防止死循环和资源滥用,对单个函数的运行时间有限制(例如回测中单函数限制1800秒)。如果您的代码极其庞大且没有合理的休眠/分步机制,可能会被系统判定为异常并终止。
- 闲置休眠:如果您长时间掉线(例如几个小时甚至更久),系统检测到前端长时间无响应,可能会回收该研究环境的资源,导致 Kernel 重启,代码运行终止。
3. 结果是否保存取决于您的代码逻辑
如果您的代码只是在最后 print 结果,或者将结果保存在内存变量中,一旦环境最终被重启,这些数据就会丢失。
给长时间运行代码的建议
为了防止掉线、死机或平台资源回收导致长时间的心血白费,建议在编写耗时较长的研究代码时采取以下措施:
1. 将结果持久化保存到文件
不要依赖内存变量或 print。在代码运行的关键节点或最终完成时,将数据写入到文件中(如 CSV、JSON 或 Pickle)。
import pandas as pd
# 假设 df 是您长时间计算得到的结果
# 将结果保存到研究环境的根目录
df.to_csv('my_long_task_result.csv')
或者使用聚宽提供的 API:
from jqdata import write_file
write_file('my_result.csv', df.to_csv(), append=False)
2. 分步保存(断点续传机制)
如果是一个需要循环处理大量数据的任务(例如遍历几千只股票),建议每处理完一部分(如100只)就将中间结果追加保存(append=True)到文件中。这样即使中途被系统强制终止,您也可以从断点处继续,而不需要从头再来。
3. 记录日志到文件
将重要的运行状态写入日志文件,方便重新连接后查看代码到底执行到了哪一步。
总结:本地掉线不用慌,云端还在帮您算。但一定要养成将重要结果写入文件的好习惯!