因此,我试图将阻止Web请求中的内容作为后台任务并利用队列。我也是消息传递和发布/订阅的新手。用户将数据推送到那里,并对其进行处理,然后通知用户有关此信息。我为此进行了一个celery设置,发现它不满足我的用例,因为每个用户都有自己的任务需要专用队列。
我尝试指定创建丢失的队列并在工作程序生成期间(以逗号分隔发送队列名称),并按照先前在Internet上针对“用芹菜动态队列创建”的答案所述,将它们列出在队列设置中。它创建队列,但是当我在设置和命令行中指定的队列名称与指定的队列名称不同时,则不会。解决方案是使用不满足用例的队列名称生成更多工作线程,因为将有数百万个数据处理请求。
我发现python-rq的名称具有Queue对象初始化,我认为这会创建新的队列。如果是这样,切换到RQ是否正确?
redis_conn = Redis()
q = Queue('some_queue', connection=redis_conn)
我想要的是每个用户在后台执行自己的任务的队列。我看不到在线用于在芹菜中创建动态队列(没有在命令行中指定队列名或设置)的任何解决方案。 python-rq似乎有该解决方案。我的权衡是从RabbitMQ和Celry迁移到Redis。
是否有一种方法可以让每个用户真正在芹菜中排队?如果是,请列出步骤。还是这种设计模式不正确? pubsub是否可以满足用例?
答案 0 :(得分:1)
Celery worker仅从task_queues
设置定义的队列中使用,或在命令行中通过-Q
选项使用队列。但是,可以从命令行或代码中动态更改它。只需确保在设置中启用了task_create_missing_queues
(这是默认设置),以便在您开始使用它们时自动创建新队列。
因此,在为给定用户发送任务之前,必须指示工作人员从用户队列开始使用。这可以通过使用add_consumer
控制命令在命令行中实现,也可以使用app.control.add_consumer()
方法从代码中实现。这些操作是无关紧要的,因此,如果工作人员已经从队列中消耗掉了,则什么也不会发生。如果队列尚不存在,则会自动创建。