如何调度Colab笔记本每6小时将Google Drive新增文件同步至GCS
如何调度Colab笔记本每6小时执行一次Drive到GCS的文件同步任务
Colab本身没有内置定时调度功能,且会话存在时长限制,以下是两种可行的实现方案:
方案1:转换为Google Cloud Function + Cloud Scheduler(推荐)
这是最稳定的长期定时方案,云函数在GCP服务器端运行,不受Colab会话限制。
实现步骤:
- 启用必要API:在GCP控制台启用Google Drive API和Cloud Storage API。
- 编写云函数代码:将Colab中的同步逻辑改写为云函数,同时添加增量同步的时间过滤逻辑(避免重复复制):
from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload from google.cloud import storage import io from datetime import datetime def sync_drive_to_gcs(event, context): # 初始化Drive和GCS客户端 drive_service = build('drive', 'v3') storage_client = storage.Client(project='dev-project') bucket = storage_client.bucket('your-bucket-name') # 替换为你的存储桶名称 # 替换为Drive中test文件夹的ID(可通过Drive网页端获取) target_folder_id = 'YOUR_DRIVE_TEST_FOLDER_ID' # 获取上次同步时间(存储在GCS的文件中) last_sync_blob = bucket.blob('last_sync_timestamp.txt') last_sync_time = last_sync_blob.download_as_text() if last_sync_blob.exists() else '1970-01-01T00:00:00Z' # 查询Drive文件夹中未被删除且修改时间晚于上次同步的文件 file_list = drive_service.files().list( q=f"'{target_folder_id}' in parents and trashed=false and modifiedTime > '{last_sync_time}'", fields="files(id, name, modifiedTime)" ).execute().get('files', []) # 同步符合条件的文件到GCS for file in file_list: # 下载Drive文件到内存 file_io = io.BytesIO() downloader = MediaIoBaseDownload(file_io, drive_service.files().get_media(fileId=file['id'])) done = False while not done: status, done = downloader.next_chunk() # 上传到GCS gcs_blob = bucket.blob(file['name']) file_io.seek(0) gcs_blob.upload_from_file(file_io) print(f"已同步文件: {file['name']}") # 更新上次同步时间为当前UTC时间 current_timestamp = datetime.utcnow().isoformat() + 'Z' last_sync_blob.upload_from_string(current_timestamp)
- 部署云函数:在GCP控制台创建云函数,选择Python 3.9+运行时,粘贴上述代码,添加依赖包
google-api-python-client和google-cloud-storage,配置服务账号权限(需包含Drive文件读取和GCS写入权限)。 - 创建定时触发任务:在GCP Cloud Scheduler中创建任务,设置触发频率为
0 */6 * * *(每6小时一次),目标类型选择HTTP,指向云函数的触发URL,认证方式选择服务账号。
方案2:外部工具触发Colab(临时场景适用)
此方案依赖Colab的会话存活,稳定性较差,仅适合临时测试:
- 防止Colab会话休眠:在Colab笔记本中添加以下代码单元格并运行,每隔1分钟点击一次连接按钮维持会话:
function keepAlive() { console.log("维持会话连接"); document.querySelector("#top-toolbar > colab-connect-button").click(); } setInterval(keepAlive, 60000);
- 外部定时触发:使用Windows任务计划、Linux Cron或第三方定时工具,通过Colab的共享链接自动化方式定时触发笔记本运行。注意:Colab会话最长约12小时,且可能因空闲被强制断开。
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

