在ABAP中实现并发就是调用异步RFC函数,可以同事执行多个函数模块而不需要等待按顺序执行,具体代码在本文的最后
实现效果:
首先定义一个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.
重要代码:
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 ).
如果通过并发的方式执行函数,即同时执行30个函数,花费的时间约为2.38s
。
这里可以明显感觉到并发的执行效率远远优于非并发执行,这里的性能比超过了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.
非并发执行结果:
并发执行结果:
可以看到,此时使用并发执行的方式运行时间反而更慢了,如果把模拟次数增加,运行时间将会差的更多。
参考文章: