0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​第二十章 使用工作队列管理器(三)​​
  • ​​管理类别​​
  • ​​DefaultWorkers​​
  • ​​MaxActiveWorkers​​
  • ​​MaxWorkers​​
  • ​​使用回调​​
  • ​​包括工作项的回调​​
  • ​​包括回调以确定完成​​
  • ​​控制当前设备的输出​​
  • ​​暂停和恢复工作队列​​
  • ​​Pause()​​
  • ​​Resume()​​

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

管理类别

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

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

系统包括两个不能删除的类别:​​SQL​​​ 和 ​​Default​​。 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​​​ 设置为等于 ​​1​​​。​​Wait()​​​ 通过引用返回 ​​AtEnd​​​。 ​​AtEnd​​​ 为 ​​1​​​ 时,所有工作都已完成。或者,如果 ​​AtEnd​​​ 为 ​​0​​,则一个或多个工作项未完成。

控制当前设备的输出

默认情况下,如果工作项向当前设备生成输出(​​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 条评论