返回 MoneyPrinterTurbo
redis_manager.py
根目录 / app / controllers / manager / redis_manager.py
1 import json
2 from typing import Dict
3
4 import redis
5
6 from app.controllers.manager.base_manager import TaskManager
7 from app.models.schema import VideoParams
8 from app.services import task as tm
9
10 FUNC_MAP = {
11 "start": tm.start,
12 # 'start_test': tm.start_test
13 }
14
15
16 class RedisTaskManager(TaskManager):
17 def __init__(
18 self,
19 max_concurrent_tasks: int,
20 redis_url: str,
21 max_queued_tasks: int = 100,
22 ):
23 self.redis_client = redis.Redis.from_url(redis_url)
24 super().__init__(max_concurrent_tasks, max_queued_tasks=max_queued_tasks)
25
26 def create_queue(self):
27 return "task_queue"
28
29 def enqueue(self, task: Dict):
30 task_with_serializable_params = task.copy()
31
32 if "params" in task["kwargs"] and isinstance(
33 task["kwargs"]["params"], VideoParams
34 ):
35 task_with_serializable_params["kwargs"]["params"] = task["kwargs"][
36 "params"
37 ].dict()
38
39 # 将函数对象转换为其名称
40 task_with_serializable_params["func"] = task["func"].__name__
41 self.redis_client.rpush(self.queue, json.dumps(task_with_serializable_params))
42
43 def dequeue(self):
44 task_json = self.redis_client.lpop(self.queue)
45 if task_json:
46 task_info = json.loads(task_json)
47 # 将函数名称转换回函数对象
48 task_info["func"] = FUNC_MAP[task_info["func"]]
49
50 if "params" in task_info["kwargs"] and isinstance(
51 task_info["kwargs"]["params"], dict
52 ):
53 task_info["kwargs"]["params"] = VideoParams(
54 **task_info["kwargs"]["params"]
55 )
56
57 return task_info
58 return None
59
60 def is_queue_empty(self):
61 return self.redis_client.llen(self.queue) == 0
62
63 def queue_size(self):
64 return self.redis_client.llen(self.queue)
65
65 lines PYTHON