You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

celery_app.py 4.6KB

3 weeks ago
4 weeks ago
3 weeks ago
2 weeks ago
1 week ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
1 week ago
1 week ago
2 weeks ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #from celery import Celery
  2. import celery.schedules
  3. from redbeat import RedBeatSchedulerEntry
  4. from datetime import timedelta
  5. from celery.schedules import crontab
  6. from celery_config import *
  7. from services.redis_service import RedisService
  8. from services.kafka_service import KafkaService
  9. from services.biz_service import BizService
  10. #from config import load_config,conf
  11. from urllib.parse import quote
  12. import asyncio,os,random,sys
  13. #from tasks import add_friends_task
  14. #from common.log import logger
  15. import logging
  16. logger = logging.getLogger('redbeat')
  17. scheduled_task_sync_wx_info_interval = 6000
  18. scheduled_task_add_contacts_from_chatrooms_interval=10
  19. environment = os.environ.get('environment', 'default')
  20. # if environment != 'default':
  21. # scheduled_task_sync_wx_info_interval = 60*11
  22. # scheduled_task_add_contacts_from_chatrooms_interval = 3600*24
  23. # if environment != 'test':
  24. # scheduled_task_add_contacts_from_chatrooms_interval = 60*10
  25. if environment == 'production':
  26. scheduled_task_sync_wx_info_interval = 60*10
  27. scheduled_task_add_contacts_from_chatrooms_interval = 60*11
  28. elif environment == 'test':
  29. scheduled_task_sync_wx_info_interval = 60*10
  30. scheduled_task_add_contacts_from_chatrooms_interval = 60*11
  31. else:
  32. scheduled_task_sync_wx_info_interval = 1000
  33. scheduled_task_add_contacts_from_chatrooms_interval=6
  34. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔秒, 任务参数)
  35. # tasks_schedule = [
  36. # #("redbeat:scheduled_task", "tasks.scheduled_task", 3, []),
  37. # #("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15, []),
  38. # ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info", scheduled_task_sync_wx_info_interval, [redis_config, kafka_config, gewe_config]),
  39. # #("redbeat:add_friends_task", "tasks.add_friends_task", random.randint(1, 10), [redis_config]), # 10分钟执行一次
  40. # ]
  41. # # 注册 RedBeat 任务
  42. # for task_id, task_name, interval, task_args in tasks_schedule:
  43. # redbeat_entry = RedBeatSchedulerEntry(
  44. # name=task_id,
  45. # task=task_name,
  46. # schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  47. # args=task_args,
  48. # app=celery_app
  49. # )
  50. # redbeat_entry.save()
  51. # # 为 add_friends_task 生成随机的分钟和小时
  52. random_minute = random.randint(0, 59)
  53. random_hour = random.randint(0, 23) # 可以根据需要调整小时范围
  54. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔或调度, 任务参数)
  55. tasks_schedule = [
  56. # 其他任务保持不变
  57. ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info",
  58. celery.schedules.schedule(timedelta(seconds=scheduled_task_sync_wx_info_interval)),
  59. [redis_config, kafka_config, gewe_config]),
  60. # # add_friends_task 使用 crontab 随机时间
  61. # ("redbeat:add_friends_task", "tasks.add_friends_task",
  62. # crontab(minute=random_minute, hour='*'), # 每小时在随机分钟执行
  63. # # 如果想每天在随机时间执行,可以用: crontab(minute=random_minute, hour=random_hour)
  64. # [redis_config]),
  65. ("redbeat:scheduled_task_add_contacts_from_chatrooms", "tasks.scheduled_task_add_contacts_from_chatrooms",
  66. celery.schedules.schedule(timedelta(seconds=scheduled_task_add_contacts_from_chatrooms_interval)),
  67. [redis_config, kafka_config, gewe_config]),
  68. ]
  69. # # 注册 RedBeat 任务
  70. for task_id, task_name, schedule_obj, task_args in tasks_schedule:
  71. redbeat_entry = RedBeatSchedulerEntry(
  72. name=task_id,
  73. task=task_name,
  74. schedule=schedule_obj, # 现在使用 schedule_obj 而不是创建新的 schedule
  75. args=task_args,
  76. app=celery_app
  77. )
  78. redbeat_entry.save()
  79. # 如果是 add_friends_task,打印其随机调度信息
  80. if task_name == "tasks.add_friends_task":
  81. if isinstance(schedule_obj, crontab):
  82. print(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  83. logger.info(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  84. else:
  85. print('scheduled_task_sync_wx_info 定时任务载入成功!')
  86. logger.info(f"scheduled_task_sync_wx_info 定时任务执行载入成功!")
  87. def setup_schedule():
  88. # 初始化第一次执行(例如:5秒后执行)
  89. initial_run_in = 5
  90. entry = RedBeatSchedulerEntry(
  91. name='random-task',
  92. task='tasks.random_scheduled_task',
  93. schedule=timedelta(seconds=initial_run_in),
  94. app=celery_app
  95. )
  96. entry.save()
  97. print(f"Initial task scheduled in {initial_run_in} seconds")
  98. setup_schedule()