0

我有 2 个beanstalkc接收器在看同一个管子"tubename"

我希望一个beanstalkc接收器优先于另一个。为了实现这一点,我想告诉最低优先级的beanstalkc接收者在保留它们之前等待任务已经 X 秒。

我找到了"reserve-with-timeout",但我既没有真正理解它,也没有设法让它在我的用例中成功运行。

class MyBeanstalkReceiver():
    def __init__(self, host=beanstalkc.DEFAULT_HOST, port=beanstalkc.DEFAULT_PORT,
                 tube="default", timeout=1):
        self.tube = tube
        self.host = host
        self.port = port
        self.timeout = timeout

    def run(self):
        while True:
            self.run_once()

    def run_once(self):
        job = self._get_task()

        try:
            body = job.body
            data = json.loads(body)
            self.job(data)
        except Exception as e:
            job.delete()

    def job(self, data):
        print(data)

    def beanstalk(self):
        beanstalk = beanstalkc.Connection(host=self.host, port=self.port)
        beanstalk.use(self.tube)
        beanstalk.watch(self.tube)
        return beanstalk

    def _get_task(self):
        return self.beanstalk().reserve(self.timeout)

还有我的 2 个beanstalkc接收器:

# receiver 1
w = MyBeanstalkReceiver(hosts=["localhost:14711"], tube="tubename", timeout=1)
w.run()
# receiver 2
w = MyBeanstalkReceiver(hosts=["localhost:14711"], tube="tubename", timeout=10000)
w.run()

在 2 个接收器之间,超时时间为 1 和 10000,当我通过管发送任务时没有任何变化:两者最终都管理相同数量的管内任务"tubename"

关于如何使“接收器 1”优先于“接收器 2”的任何想法?

4

2 回答 2

0

Beanstalkd 不区分客户端或接收者的优先级。

于 2020-08-18T21:41:04.957 回答
0

超时时间reserve是客户端在没有工作的情况下返回之前等待的时间。

您可能正在寻找put (with a delay) ,其中作业在队列中至少等待n秒后才会释放。

每个工作也有一个优先级。如果接收者可以同时看到它们,它将返回任何具有较高优先级(即:接近 0)而不是具有较低优先级(具有较大数字)的作业。

于 2020-08-06T18:18:39.433 回答