使用并行处理时,如何检查所有子WP是否结束?

2020-08-27 04:44发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


好吧,假设我必须处理总计50个WP(在特定时间最多限制为10个),如何检查所有子WP是否已终止?

当然,它们具有相同的过程,但是由于外部因素,它们的处理时间可能会略有不同。 当前已完成,并在主程序中放入多少个WP,然后检查它们是否具有相同的值。

但是它不起作用。 我认为将会有某种标准的FM来检查以跟踪所有子WP。

任何想法都会受到赞赏。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


好吧,假设我必须处理总计50个WP(在特定时间最多限制为10个),如何检查所有子WP是否已终止?

当然,它们具有相同的过程,但是由于外部因素,它们的处理时间可能会略有不同。 当前已完成,并在主程序中放入多少个WP,然后检查它们是否具有相同的值。

但是它不起作用。 我认为将会有某种标准的FM来检查以跟踪所有子WP。

任何想法都会受到赞赏。

付费偷看设置
发送
3条回答
浮生未央
1楼 · 2020-08-27 04:55.采纳回答

对于大规模并行处理,请构建"工作包"以首先使用功能模块进行处理。 在包处理的结构中,添加一个GUID字段,然后为每个包获取一个。

然后,执行如下任务,其中 -guid是您创建的GUID。

通话功能" Z_YOUR_FM"
         开始新任务 -guid
         在任务结束时调用on_ret ON 
....

" on_ret"方法应具有导入参数

方法ON_RET
     输入
       !P_TASK类型GUID_32。

   方法on_ret。

     数据:lt_data TYPE...。
           lv_frtext TYPE char255,
           lv_subrc TYPE sy-subrc,
           lv_msg TYPE bapiret2-消息。

     字段符号:
            TYPE gty_pack。

     在guid = p_task的地方删除gt_task。

     从功能" Z_YOUR_FM"获得的结果
     导入et_rfc = lt_data
               ev_subrc = lv_subrc
               ev_frtext = lv_frtext。

     使用表键guid = p_task读取表gt_pack
     分配。
 *如果读取失败,我们希望看到转储
 ...


   终结法。
 

在该方法内部,阅读您的工作包表并将其标记为已处理。 您甚至可以使用" start_timestampl"和" end_timestampl",以便可以跟踪哪个工作包消耗了多少时间。 这样您就可以知道哪个软件包已经被处理。

要控制使用的最大进程数,我使用了一个附加表" gt_tasks",该表在这样的" worker_get"方法中处理

 TYPES:BEGIN OF gty_task,
            TYPE类型的时间戳,
            guid类型guid_32,
         结束于gty_task。
   数据:GTY_TASK的GT_TASK类型表。

 方法WORKER_GET
     输入
       !IV_GUID类型GUID_32
     返回
       value(RV_OK)类型ABAP_BOOL。  
方法worker_get。 常量:lc_task_max TYPE i VALUE 5。" <<<最大进程数 字段符号: TYPE gty_task。 ****************************************************** ******************** 检查:lines(gt_task)。 获取时间戳字段 -timestampl。 -guid = iv_guid。 rv_ok = abap_true。 "请参阅上面的检查

在循环中,在其中处理工作包的地方,等待这样的免费过程。

在gt_pack ASSIGNING 处循环播放。
       等待异步任务直到(me-> worker_get(iv_guid =  -guid)EQ abap_true)。
 "等待直到me-> worker_get(iv_guid =  -guid)EQ abap_true。" <<<在较旧的系统中,需要使用

 

最后,等待最后一个过程完成!

等待异步任务(gt_task IS INITIAL)。
 
clever101
2楼-- · 2020-08-27 04:48

如果锁有问题,则与RFC框架本身无关,而是与被调用函数模块的工作方式有关(如果它们并行工作,则可能存在一些交叉锁。 ..)如果没有更多信息,我无话可说。

在这种情况下,数据库锁一直是个问题,至少在ECC 6.0中(不确定HANA系统) 。 是的,只是在两者之间增加延迟是通常的处理方式。

或者在某些情况下(例如批量处理),我们只运行所有内容,然后仅再次运行由于任何错误而未处理的内容。 例如,在一个项目中,我们有一个IDoc接口在后台处理大量数据。 可以这么说,IDoc有时会互相踩到脚趾,然后尝试锁定相同的数据,然后失败。 因此,我们只是在同一工作的最后一步中添加了IDoc重新处理程序。 在那之后,我们很少遇到任何问题。 即使您不使用IDoc,也可以使用类似的策略:继续操作,然后再返回任何错误。

如果有人找到了更好的解决方案,我将非常有兴趣知道。

好,最后,我在代码中放入了一些重新处理的DO〜ENDDO子句,以删除Wait〜直到子句(感谢Jelena!)。

好吧,延迟0.3秒与重新处理之间没有什么区别。
当然,我还没有测试过大量数据(10,000+),可以在大约500个数据集中找到,并行处理需要 比执行1 WP花费的时间更多(延迟/等待在SAT上始终是最重要的)。


好,谢谢大家的回复。

一周热门 更多>