通过并行处理的方式提升程序的效率

举报
雨绸缪 发表于 2023/10/30 16:28:30 2023/10/30
【摘要】 每个 ABAPer 肯定都会遇到有关性能调优的问题。通常我们使用琐碎的方法来优化性能。在本文中,我们将讨论 ABAP 中关于异步 RFC 功能模块的并行处理主题。性能调整的略有不同的观点。这背后的想法是使用 RFC 接口异步调用支持远程的功能模块。在本文中,我们将讨论 ABAP 中关于异步 RFC 功能模块的并行处理主题。性能调整的视角略有不同。这背后的想法是使用 RFC 接口异步调用支持远...

每个 ABAPer 肯定都会遇到有关性能调优的问题。通常我们使用琐碎的方法来优化性能。

在本文中,我们将讨论 ABAP 中关于异步 RFC 功能模块的并行处理主题。性能调整的略有不同的观点。这背后的想法是使用 RFC 接口异步调用支持远程的功能模块。

在本文中,我们将讨论 ABAP 中关于异步 RFC 功能模块的并行处理主题。性能调整的视角略有不同。

这背后的想法是使用 RFC 接口异步调用支持远程的功能模块。

为了理解这个概念,我们将举一个简单的例子,我们将使用BAPI_MATERIAL_GET_DETAIL 从物料编号中获取物料描述,然后我们将尝试使用并行处理来优化性能。

没有使用并行处理的程序

所以没有任何并行处理的程序看起来像这样:

*&---------------------------------------------------------------------*
*& Report ZMATXT_WITHOUT_PARALLER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmatxt_without_paraller.

TABLES : mara.

DATA : bapimatdoa TYPE bapimatdoa,
       bapireturn TYPE bapireturn.

SELECT-OPTIONS s_matnr FOR mara-matnr.

LOOP AT s_matnr.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input        = s_matnr-low
    IMPORTING
      output       = s_matnr-low
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.
  ENDIF.


  CALL FUNCTION 'BAPI_MATERIAL_GET_DETAIL'
    EXPORTING
      material_long         = s_matnr-low
    IMPORTING
      material_general_data = bapimatdoa.

  WRITE : bapimatdoa-matl_desc.

ENDLOOP.

在循环执行过程中,控件每次都会等待功能模块返回值,然后循环才会继续执行下一条记录。

使用并行处理的程序

在这种情况下,只有一个工作进程忙于执行您的程序,其他工作进程即使处于闲置状态也不会被考虑。让我们先看看程序,然后再详细了解。

*&---------------------------------------------------------------------*
*& Report ZMATXT_WITH_PARALLER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmatxt_with_paraller.

TABLES: mara.

DATA: bapimatdoa TYPE bapimatdoa,
      bapireturn TYPE bapireturn.

DATA: system      TYPE rzlli_apcl,
      taskname(8) TYPE c,
      index(3)    TYPE c,
      snd_jobs    TYPE i,
      rcv_jobs    TYPE i,
      exc_flag    TYPE i,
      mess        TYPE c LENGTH 80.

TYPES: BEGIN OF type_material,
         matnr TYPE matnr,
         desc  TYPE maktx,
       END OF type_material.

DATA: material_wa   TYPE type_material,
      material_list TYPE STANDARD TABLE OF type_material.

DATA: functioncall(1) TYPE c.

CONSTANTS: done(1) TYPE c VALUE 'X'.

SELECT-OPTIONS s_matnr FOR mara-matnr.


LOOP AT s_matnr.

  index = sy-tabix.
  CONCATENATE 'TASK' index INTO taskname. " 生成唯一 TASKCALL FUNCTION 'BAPI_MATERIAL_GET_DETAIL' STARTING NEW TASK taskname
    DESTINATION IN GROUP DEFAULT
    PERFORMING set_function1_done ON END OF TASK
    EXPORTING
      material_long         = s_matnr-low
    EXCEPTIONS
      system_failure        = 1 MESSAGE mess
      communication_failure = 2 MESSAGE mess
      resource_failure      = 3.

  CASE sy-subrc.
    WHEN 0.
      snd_jobs = snd_jobs + 1.
    WHEN 1 OR 2.
      MESSAGE mess TYPE 'I'.
    WHEN 3.
      IF  snd_jobs >= 1 AND exc_flag = 0.
        exc_flag = 1.

        WAIT UNTIL rcv_jobs >= snd_jobs
        UP TO 5 SECONDS.
      ENDIF.
      IF sy-subrc = 0.
        exc_flag = 0.
      ELSE.
        MESSAGE 'Resource failure' TYPE 'I'.
      ENDIF.

    WHEN OTHERS.
      MESSAGE 'Other error' TYPE 'I'.
  ENDCASE.
ENDLOOP.

WAIT UNTIL rcv_jobs >= snd_jobs.

LOOP AT material_list INTO material_wa.
  WRITE: / material_wa-matnr, ':', material_wa-desc.
  ULINE.
ENDLOOP.
*&---------------------------------------------------------------------*
*&      Form  SET_FUNCTION1_DONE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_function1_done USING taskname.
  rcv_jobs = rcv_jobs + 1.

  RECEIVE RESULTS FROM FUNCTION 'BAPI_MATERIAL_GET_DETAIL'
    IMPORTING
      material_general_data = bapimatdoa
      return = bapireturn.
  IF sy-subrc = 0.
    material_wa-matnr = bapimatdoa-old_mat_no_long.
    material_wa-desc = bapimatdoa-matl_desc.
    APPEND material_wa TO material_list.
  ENDIF.

  functioncall = done.
ENDFORM.

运行结果:

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。