Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

116 lines
4.5KB

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