所以我正在尝试将 Web 请求中的阻塞内容作为后台任务并利用队列。我也是消息传递和发布/订阅的新手。用户推送到那里的数据并进行处理,稍后用户会收到通知。我为此做了一个芹菜设置,发现它不能满足我为每个用户自己的任务提供私人队列的用例。
我尝试指定创建缺少的队列和在工人生成期间(发送以逗号分隔的队列名称),并将它们列在队列设置中,如之前在互联网上的"使用芹菜动态创建队列"的答案中所述。它会创建队列,但当我在设置和命令行中指定与指定名称不同的队列名称时,它不会创建队列。解决方案是生成更多具有队列名称的工作线程,这不能满足用例,因为将有数百万个数据处理请求。
我发现python-rq的名称具有队列对象初始化功能,我认为它会创建新的队列。如果是这样,转移到 RQ 是正确的吗?
redis_conn = Redis()
q = Queue('some_queue', connection=redis_conn)
我想要的是每个用户在后台排队执行自己的任务。我在网上没有看到任何用于在芹菜中创建动态队列(无需在命令行中指定队列名称或设置)的解决方案。python-rq似乎有这个解决方案。我在这方面的权衡是从 RabbitMQ 和芹菜转向 redis。
有没有办法真正在芹菜中按用户排队?如果是,请列出步骤。还是这种设计模式不对?pubsub 会满足用例吗?
Celery worker 仅从task_queues
设置定义的队列中使用,或者在带有-Q
选项的命令行上给出的队列中使用。但是,可以从命令行或代码动态更改此设置。只需确保在设置中启用task_create_missing_queues
(这是默认设置),以便在您开始使用新队列时自动创建新队列。
因此,在为给定用户发送任务之前,您必须指示工作人员从用户的队列中开始使用。这可以通过使用add_consumer
控制命令从命令行实现,也可以通过使用app.control.add_consumer()
方法从代码中实现。这些操作是可识别的,因此如果工作线程已从队列中使用,则不会发生任何操作。如果队列尚不存在,则会自动创建队列。