ABAP并发执行函数 异步RFC

文章通过示例展示了在ABAP中如何利用异步RFC实现并发调用函数,以提高执行效率。在有模拟运行时间的情况下,并发执行30个函数模块相比于非并发执行显著减少了总耗时。然而,当函数无实际耗时,并发执行可能因额外的调度开销导致效率下降。文章强调并发并非总是优于非并发,并通过不同场景下的执行时间对比进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ABAP中实现并发就是调用异步RFC函数,可以同事执行多个函数模块而不需要等待按顺序执行,具体代码在本文的最后

实现效果:
image-20230704135322302

首先定义一个RFC函数:

image-20230704135702597

FUNCTION ZRFC_THREAD_TEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_TASK_ID) TYPE  I
*"  EXPORTING
*"     VALUE(EV_TASK_NAME) TYPE  STRING
*"----------------------------------------------------------------------
  DATA:LV_TASK_ID TYPE STRING.
  LV_TASK_ID = IV_TASK_ID.
  WAIT UP TO 2 SECONDS.			"模拟运行时间2s
  CONCATENATE 'TASK ' `   ` LV_TASK_ID `   `  'HAS RUN!' INTO EV_TASK_NAME.

ENDFUNCTION.

重要代码:

CALL FUNCTION 'ZRFC_THREAD_TEST'
      STARTING NEW TASK TASK_NAME     "可以理解为线程名为<TASK_NAME>
      DESTINATION IN GROUP DEFAULT    "调用系统 DEFAULT为当前系统
      PERFORMING FRM_CALLBACK ON END OF TASK "在这个TASK结束后接着执行的FORM名为 FRM_CALLBACK
      EXPORTING
        IV_TASK_ID            = GV_INDEX
      EXCEPTIONS
        SYSTEM_FAILURE        = 1 MESSAGE MESS		"系统错误
        COMMUNICATION_FAILURE = 2 MESSAGE MESS		"通信错误
        RESOURCE_FAILURE      = 3.				   "资源错误
        
        ...
        
FORM FRM_CALLBACK USING TASK_NAME.
  DATA:LV_TASK_NAME TYPE STRING.
  RECEIVE RESULTS FROM FUNCTION 'ZRFC_THREAD_TEST'
   IMPORTING
     EV_TASK_NAME = LV_TASK_NAME.    "得到函数ZRFC_THREAD_TEST的输出值
  ...
ENDFORM.

本文模拟了30次调用函数,每次执行会花费2s时间,如果不用并发执行,按照以下代码块依次执行30次则会花费超过30 * 2 = 60s的时间,本次具体花费时间约为60.32s

DATA:GT_DATA TYPE TABLE OF STRING.
DATA:GV_TASK_NAME TYPE STRING.
DO 30 TIMES.
  CALL FUNCTION 'ZRFC_THREAD_TEST'
    EXPORTING
      IV_TASK_ID   = SY-INDEX
    IMPORTING
      EV_TASK_NAME = GV_TASK_NAME.
  APPEND GV_TASK_NAME TO GT_DATA.
  CLEAR GV_TASK_NAME.
ENDDO.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( GT_DATA ).

image-20230704135518439

如果通过并发的方式执行函数,即同时执行30个函数,花费的时间约为2.38s

image-20230704135535170

这里可以明显感觉到并发的执行效率远远优于非并发执行,这里的性能比超过了30

当然,其实也不是所有的情况下使用并发效率都优于非并发,接下来我们将RFC函数中的模拟运行时间去掉,如下:

FUNCTION ZRFC_THREAD_TEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_TASK_ID) TYPE  I
*"  EXPORTING
*"     VALUE(EV_TASK_NAME) TYPE  STRING
*"----------------------------------------------------------------------
  DATA:LV_TASK_ID TYPE STRING.
  LV_TASK_ID = IV_TASK_ID.
  "WAIT UP TO 2 SECONDS.			"模拟运行时间2s
  CONCATENATE 'TASK ' `   ` LV_TASK_ID `   `  'HAS RUN!' INTO EV_TASK_NAME.

ENDFUNCTION.

非并发执行结果:

image-20230704142137636

并发执行结果:

image-20230704142226884

可以看到,此时使用并发执行的方式运行时间反而更慢了,如果把模拟次数增加,运行时间将会差的更多。

参考文章:

  1. 对ABAP程序调优的学习(三)并行并发读取
  2. 并发执行解决ABAP程序效能问题
  3. [ ABAP ] - 使用异步RFC实现并行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值