运行后台作业

有时,您可能不希望用户请求立即执行,而是将其添加到队列中,由后台工作进程执行。这样做的好处是,您的 Web 工作进程可以保持空闲以执行其他请求,并且较长的任务不会耗尽您的所有资源。

Frappe 使用 Python RQ 来运行后台任务。以下示例说明了如何将任务加入队列:

import frappe

def long_job(arg1, arg2):
 frappe.publish_realtime('msgprint', 'Starting long job...')
 # this job takes a long time to process
 frappe.publish_realtime('msgprint', 'Ending long job...')

def enqueue_long_job(arg1, args2):
 frappe.enqueue('myapp.mymodule.long_job', arg1=arg1, arg2=arg2)

这会将 long_job 加入名为 default 的队列。其他可用的队列包括 long 和 short。您应根据预估的任务执行时长来选择适当的队列。

从版本 14 开始,您还可以通过在入队调用中将 at_front 作为 True 传递,将任务添加到队列的前端。

在文档对象上调用延迟操作

您也可以在文档对象上调用延迟操作,例如在库存盘点中,如果项目超过 100 个,则会作为后台任务执行。

示例:您可以调用 doc.queue_action('submit')

注意:这仅适用于 save、submit、cancel

如果您预计某些操作的执行量非常大,也可以将其推送到后台执行。

例如:

def submit(self):
 if len(self.items) > 100:
  self.queue_action('submit')
 else:
  self._submit()

调试

如果您正在使用 bench start

您将在终端中看到日志。

注意:默认的工作进程不会自动重启,因此您需要在修改后终止 bench 并重新启动。