文章
· 七月 6, 2022 阅读大约需 4 分钟

第二十章 使用工作队列管理器(三)

第二十章 使用工作队列管理器(三)

管理类别

一个类别是一个独立的worker jobs池。当初始化一组worker jobs时,可以指定提供worker的类别。如果集合中的任何worker jobs在执行work项时请求额外的worker jobs,则新的worker jobs来自同一类别。

例如,假设系统提供的 SQL 类别分配了最多 8 个worker。然后,假设与BusinessIntelligence相关的流程创建了一个类别,并将最多四个worker分配给该类别。如果 SQL 池中的所有worker在给定时间都参与了工作,则 BusinessIntelligence 类别中的worker可能仍然可以立即处理工作项。

系统包括两个不能删除的类别:SQLDefault。 SQL 类别适用于系统执行的任何 SQL 处理,包括查询的并行处理。当在未指定类别的情况下初始化一组worker jobs时,默认类别提worker jobs。

每个类别都具有影响该类别中每个工作队列的行为的属性。这些属性是:

DefaultWorkers

当创建此类别中的工作队列且未指定worker job 计数时,这将成为工作队列中worker job 的数量。此属性的默认值是核心数。

MaxActiveWorkers

在此类别的job服务请求池中保留的活动worker job的最大数量。检测到空闲job并自动启动新job以将最大活动job数保持在此限制附近。默认值为核心数的两倍。

MaxWorkers

此类别中工作队列的最大worker job数。如果在创建工作队列时指定了更多的worker job,则使用此限制。默认值为核心数的两倍。

要创建类别、调整类别属性和删除自定义类别,请导航到System Administration > Configuration > System Configuration > WQM Categories.。自定义类别的名称区分大小写,可能包含字母、数字、下划线、破折号和句点。

使用回调

回调是工作队列管理器在完成工作项后必须执行的代码。可以使用回调有两个原因:
- 执行依赖于工作项完成的工作
- 如果选择异步完成工作项,则表示所有排队的工作都已完成

包括工作项的回调

要添加回调,请在将工作项添加到工作队列时调用 QueueCallback() 方法而不是 Queue() 方法:

method QueueCallback(work As %String, callback As %String, args... As %String) as %Status

work 和 args 方法与 Queue() 方法相同。但是,回调参数使用以下语法指定要执行的回调代码:
- ##class(Classname).ClassMethod 用于类方法
- $$entry^rtn 用于子程序

类方法或子例程必须以相同的顺序接受与主工作项相同的参数。主进程将相同的参数传递给主工作项和回调代码。

回调代码可以访问以下公共变量:

  • %job,其中包含实际完成工作的进程的作业 ID
  • %status,其中包含工作单元返回的%Status
  • %workqueue,即工作队列实例的OREF

这些公共变量在回调中可用,但在工作项中不可用。

包括回调以确定完成

可以轮询工作队列管理器以确定完成,而不是使用 WaitForComplete() 方法等待工作队列中的所有排队工作完成后再返回主进程,如下所示:
- 如上一节所述,使用 QueueCallback() 方法而不是 Queue() 方法将工作项添加到工作队列。
- 当所有工作项的工作完成后,在回调代码中将公共变量 %exit 设置为 1
- 使用 Wait() 方法而不是 WaitForComplete() 方法:

method Wait(qspec As %String, byRef AtEnd As %Boolean) as %Status

Wait() 方法等待来自回调的信号返回给调用者。具体来说,它等待回调代码将公共变量 %exit 设置为等于 1Wait() 通过引用返回 AtEndAtEnd1 时,所有工作都已完成。或者,如果 AtEnd0,则一个或多个工作项未完成。

控制当前设备的输出

默认情况下,如果工作项向当前设备生成输出(WRITE 语句),工作队列会将输出保存在缓冲区中,直到 WaitForComplete()Wait() 结束。如果希望工作项更早地生成输出,请让该工作项调用 %SYSTEM.Context.WorkMgr 类的 Flush() 类方法,例如:

set sc = $system.Context.WorkMgr().Flush()

当工作项调用此方法时,会导致父工作队列写入工作项的所有已保存输出。

此外,可以使用 -d 标志来禁止对当前设备的所有输出。在这种情况下,Flush() 方法什么也不做,因为没有输出。

暂停和恢复工作队列

%SYSTEM.WorkMgr 类提供了可用于在工作队列中暂停和恢复工作的方法:

Pause()

method Pause(timeout As %Integer, ByRef completed As %Boolean = 0) as %Status

阻止与此工作队列关联的worker jobs接受来自此工作队列的其他项目。 Pause() 方法还会停止任何正在进行的工作项。

timeout 参数表示方法在停止正在进行的工作项之前等待的时间量(以秒为单位)。超时时间过后,该方法返回完成值,该值指示调用 Pause() 方法时正在进行的工作项是否已完成。因此,可以传入超时值 0 以立即知道worker jobs是否完成了工作队列中的所有工作项。

Resume()

method Resume() as %Status

如果之前已使用 Pause() 方法暂停,则恢复此工作队列中的工作。具体来说,此方法使工作队列进程能够接受并启动工作队列中的任何其他项目。

讨论 (0)1
登录或注册以继续