有时,您可能不希望用户请求立即执行,而是将其添加到队列中,由后台工作进程执行。这样做的好处是,您的 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 并重新启动。