# PyTimedTasks **Repository Path**: shu2015626/PyTimedTasks ## Basic Information - **Project Name**: PyTimedTasks - **Description**: 使用Django和Celery定制的python定时任务上线与管理工具 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-07-05 - **Last Updated**: 2024-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PyTimedTasks >python定时任务项目: >(1)可以设置周期任务及定时任务 >(2)任务可以是项目中定义的、也可以命令行命令、还可以是需要登录远程主机的任务 ![定时任务配置页面](./docs/images/PyTimedTasks.png) ## 1.介绍 ### 1.1定时任务项目说明 性质:本项目是一个独立的项目,开发的不是第三方的模块。 功能:用来设置一些定时任务。初衷是用来聚集一些零散的python任务,但本项目不限于此,凡是命令行可以执行的命令都可以调度。 技术栈: django+celery+flower+supervisord+sentry+redis+nginx+uwsgi+postgresql postgresql支持json字段,以及Python语言编写的存储过程,方便存储爬虫数据并转存到其他数据库 可以省却MongoDB数据库,以及单独写转存或者抽取的脚本 ### 1.2一般定时任务 一般定时任务由三种模式,对应apps/common_tasks/tasks目录下的三个文件。 one.py: compile模式,可以满足任务文件修改后不需要重启就能生效的功能,但可能污染项目启动时的环境。不建议!!! two.py: subprocess模式,只要任务能够使用python xxx.py的方式启动,就可以。建议! three.py: execute模式,任务在项目内定义,建立放在apps/common_tasks/business目录下, 然后引入执行。当任务不经常变动时,建议使用此模式。 ### 1.3一般定时任务 远程定时任务,允许程序登录到远程主机(或者本机另外一个账户)执行命令。本模式和一般定时任务的subprocess模式一致。只要时能执行的命令都可以设置 ## 2.如何在开发环境调试本项目 首先需要clone本项目,然后切换到项目根目录. >注:开发调试使用的sqlite数据库 ### 2.1 运行项目 #### 2.1.1 配置django python manage.py collectstatic python manage.py makemigrations python manage.py migrate python manage.py createsuperuser #### 2.1.2 启动django python manage.py runserver ### 2.2 启动任务测试 本项目使用celery作为异步任务调度工具 #### 2.2.1 启动redis celery依赖于一个队列,需要先开启redis(如果使用rabitmq请自行调整配置文件) #### 2.2.2 启动celery linux: celery -A PyTimedTasks worker -l info windows: celery -A PyTimedTasks worker -l info -P eventlet #### 2.2.3 启动celery beat celery -A PyTimedTasks beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler #### 2.2.4 用flower监控celery的队列及任务状态 celery -A PyTimedTasks flower --port=5555 --basic_auth=flower:PyTimedTasks --persistent=True --url_prefix=ptt/flower ## 3. 如何运行起来本项目 考虑到项目依赖较多,本项目提供了一个脚本(deploy_tools.py),可以一行命令启动整个项目。 现假设,项目运行在centos7.6上,用户名为anand,python环境采用3.7,由virtualenv+virtualenvwrapper管理(虚拟环境py37_timed_tasks)。 使用者掌握linux的软件如何安装,主要是redis和nginx(可以关注本人的博客:https://www.cnblogs.com/anand-sun/, 后续会陆续迁移其他平台的技术文章至此,会包含常用的redis,nginx,数据库等) ![软件](./docs/images/software.png) ### 3.1 启动redis /path/to/redis/bin/redis-server /path/to/redis/conf/conf-single/redis-6379.conf redis的目录结构: ![redis目录结构](./docs/images/redis.png) ### 3.2 配置变量修改 (1)deploy_tools.py 注意各个文件路径等的设置 (2)PyTimedTasks/settings.py 注意路径、邮箱、DEBUG=False、redis等配置 (3)PyTimedTasks/conf_prod.py 注意redis、sentry等配置 (4)PyTimedTasks/app_monitor.yaml 注意邮箱的设置、主要是app_monitor.py要用,负责监控整个程序是否正常运行 (5)deploys/* nginx、uwsgi、supervisor的配置文件 注意配置文件内的路径、ip等修改 ### 3.3 deploy_tools.py使用 (1)切换虚拟环境: workon py37_timed_tasks (2)获取帮助: python deploy_tools --help (3)启动应用: python deploy_tools.py init all (4)停止应用: python deploy_tools.py finish all 在init操作后,还可以对单个任务进行重启、关闭。或者通过supervisor后台页面操作 python deploy_tools.py restart all/nginx... python deploy_tools.py stop all/nginx... 程序启动后可以通过supervisor后台页面管理进程: ![supervisor后台页面](./docs/images/supervisor.png) 程序启动时,同时配置了flower页面,用来监控celery的任务: ![flower监控页面](./docs/images/flower.png) ### 3.4 多服务器负载任务 只需要在另一台服务器clone一份相同的代码。 然后修改: deploys/supervisord/supervisord_py_timed_tasks.conf配置文件的最后一行,删除main.d/*.conf,变成files=conf.d/*.conf 因为如下程序:celerybeat、flower、nginx、uwsgi都只能启动一个 另外为了保持稳定可以将redis改为sentinel模式 ### 3.5 其他内容 (1)sentry是用来进行日志收集的工具,如果有配置起来,如果没有,可以将USE_SENTRY改为False. 该工具是跨语言的,不过依赖很多,建议使用docker启动 (2)程序启动后要先配置一个定时写心跳的任务 (3)app_monitor.py可以监控整个程序的运行是否正常 任务配置页面:(要先配置一个写心跳任务) ![任务配置页面](./docs/images/heartbeat.png) ## 计划 1.v0.0.1 设置定时任务(包括:程序内定义、命令行任务、远程任务) 已完成 2.v0.0.2 内置爬虫任务,可以完成定时抓取任务 待完成 3.v0.0.3 对部分任务开发api接口,方便需要的时候远程调度及获取数据 待完成