gpt4 book ai didi

python - 查看流.io : implementing a queue task

转载 作者:太空狗 更新时间:2023-10-30 01:14:12 26 4
gpt4 key购买 nike

我想用 ViewFlow library 实现以下用例:

问题

由用户启动的特定 Flow 的进程必须在队列中等待,然后才能执行 celery 作业。每个用户都有一个这些进程的队列。根据时间表或手动触发,允许队列中的下一个进程继续进行。

例子

我的流程中的一个节点进入一个命名队列。应用程序中的其他逻辑为每个队列确定何时允许执行下一个任务。选择队列中的下一个任务并调用其激活的 done() 方法。

示例流程可能如下所示:

class MyFlow(Flow):

start = flow.Start(...).Next(queue_wait)
queue_wait = QueueWait("myQueue").Next(job)
job = celery.Job(...).Next(end)
end = flow.End()

问题

实现排队的最佳方法是什么?在上面的例子中,我不知道“QueueWait”应该是什么。

我已经通读了文档和 viewflow 代码,但我还不清楚这是否可以使用内置的 Node 和 Activation 类(例如 func.Function)来完成,或者我是否需要使用自定义类进行扩展.

最佳答案

经过多次试验,我找到了一个可行且简单的解决方案:

from viewflow.flow import base
from viewflow.flow.func import FuncActivation
from viewflow.activation import STATUS


class Queue(base.NextNodeMixin,
base.UndoViewMixin,
base.CancelViewMixin,
base.DetailsViewMixin,
base.Event):

"""
Node that halts the flow and waits in a queue. To process the next waiting task
call the dequeue method, optionally specifying the task owner.

Example placing a job in a queue::

class MyFlow(Flow):
wait = Queue().Next(this.job)
job = celery.Job(send_stuff).Next(this.end)
end = flow.End()

somewhere in the application code:
MyFlow.wait.dequeue()
or:
MyFlow.wait.dequeue(process__myprocess__owner=user)

Queues are logically separated by the task_type, so new queues defined in a
subclass by overriding task_type attribute.
"""

task_type = 'QUEUE'
activation_cls = FuncActivation

def __init__(self, **kwargs):
super(Queue, self).__init__(**kwargs)

def dequeue(self, **kwargs):
"""
Process the next task in the queue by created date/time. kwargs is
used to add task filter arguments, thereby effectively splitting the queue
into subqueues. This could be used to implement per-user queues.

Returns True if task was found and dequeued, False otherwise
"""
filter_kwargs = {'flow_task_type': self.task_type, 'status': STATUS.NEW}
if kwargs is not None:
filter_kwargs.update(kwargs)

task = self.flow_cls.task_cls.objects.filter(**filter_kwargs).order_by('created').first()
if task is not None:
lock = self.flow_cls.lock_impl(self.flow_cls.instance)
with lock(self.flow_cls, task.process_id):
task = self.flow_cls.task_cls._default_manager.get(pk=task.pk)
activation = self.activation_cls()
activation.initialize(self, task)
activation.prepare()
activation.done()
return True

return False

我试图让它尽可能通用,并支持多个命名队列和子队列的定义,例如每用户队列。

关于python - 查看流.io : implementing a queue task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com