# -*- coding: utf-8 -*-
import logging
from typing import List
logger = logging.getLogger(__name__)
class BaseQueue(object):
def __init__(self,redis_cli, name):
self.redis_cli = redis_cli
self.name = name
async def items(self):
return await self.redis_cli.lrange(self.name, 0, -1)
async def push(self, *value, force: bool = True):
if force:
await self.redis_cli.lpush(self.name, *value)
else:
values = await self.items()
new_value = [i for i in value if bytes(i, encoding="utf8") not in values]
if new_value:
await self.redis_cli.lpush(self.name, *new_value)
async def pop(self):
return await self.redis_cli.rpop(self.name)
async def remove(self, value):
await self.redis_cli.lrem(self.name, 0, value)
async def has(self, value) -> bool:
s = await self.items()
return True if s and value in s else False
class MaintainQueue(BaseQueue):
def __init__(self, redis_cli):
super(MaintainQueue, self).__init__(redis_cli, 'proxy:job:maintain')
async def add_job(self, data):
await self.push(data)
class MaintainQueueManager(object):
def __init__(self, redis_cli):
self.host_queue = BaseQueue(redis_cli, 'maintain:host')
self.job_queue = MaintainQueue(redis_cli)
class JobQueue(BaseQueue):
def __init__(self, redis_cli, name):
self.redis_cli = redis_cli
self.__key__ = name
self.queue_prefix = "proxy:job:general:"
super(JobQueue, self).__init__(redis_cli, f"{self.queue_prefix}{name}")
class JobQueueManager(object):
def __init__(self, redis_cli):
self.redis_cli = redis_cli
self.queue_prefix = "proxy:job:general:"
async def queues(self) -> List[JobQueue]:
return [JobQueue(self.redis_cli, i.decode().split(self.queue_prefix)[1]) \
async for i in self.redis_cli.scan_iter(match=f"{self.queue_prefix}*")]
async def add_job(self, key, value):
await JobQueue(self.redis_cli, key).push(value)
python3.7 redis队列类实现
最新推荐文章于 2022-12-29 10:16:08 发布