如何基于动态参数24/7同时运行同一Python脚本超200次
实现方案拆解
1. 任务调度:用分布式队列替代原生多进程/线程
原生多进程/线程没法高效管理200+任务的生命周期、故障恢复,换分布式任务队列框架更靠谱:
- 用
Celery搭配Redis或RabbitMQ做消息中间件:- 把HTTP采集、Selenium购买拆成独立任务函数,比如
collect_data_task(param)和buy_task(item_data) - 队列自动分发任务,支持并发控制(可以启动200+worker实例,或者用
autoscale动态调整负载) - 自带任务重试、失败重启机制,满足24/7稳定运行的需求
- 把HTTP采集、Selenium购买拆成独立任务函数,比如
- 嫌Celery重的话,轻量选
RQ(Redis Queue),配置简单,适合不需要复杂路由的场景
2. 动态参数存储:数据库+缓存组合
搭建在线数据库存实时参数,这么搞:
- 用
PostgreSQL或MySQL做持久化存储,建个task_params表,字段包括param_id、param_content、status(待处理/处理中/已完成)、update_time - 搭配
Redis做缓存,高频读的参数先从Redis取,减轻数据库压力;参数更新时同步更新Redis和数据库 - 写个简单的参数管理接口(用FastAPI/Flask就行),方便在线添加、修改、删除参数
3. 任务触发与监控
- 定时拉取参数:用
Celery Beat或APScheduler定期从数据库捞最新参数,把待处理的推去任务队列 - 状态监控:
- 用
Flower查看Celery任务的运行状态、失败率、worker负载 - 数据库里记录每个任务的执行日志和状态,方便排查问题
- 用
- 故障恢复:worker崩了Celery自动重启任务;Selenium实例崩了的话,在任务函数里捕获异常,标记任务失败并触发重试
4. Selenium性能优化(核心)
200+Selenium实例同时跑太吃资源,必须优化:
- 用
Selenium Grid或Playwright Cluster复用浏览器实例,别每次都开新浏览器 - 开启无头模式(
--headless=new),节省内存 - 给每个worker分配固定资源(CPU核心、内存),避免资源耗尽
5. 24/7运行保障
- 把worker进程注册成系统服务:Linux用
systemd,Windows用NSSM,实现开机自启、进程崩溃自动重启 - 配置日志轮转(用
logging模块的RotatingFileHandler),防止日志文件撑爆磁盘 - 定期备份数据库和任务日志,避免数据丢失
内容的提问来源于stack exchange,提问作者johne518
相关产品推荐
相关产品推荐

