我正在SAS中运行3个并行会话,需要确保它们都已全部运行,然后再将它们放在一起。我使用WAITFOR命令来执行此操作,但行为与预期不符。
我正在使用基本SAS 9.3
这是我用来登录会话的代码:
%macro open_sessions(n);
%let t=2;
%let j = %eval(&n. + 1);
%do %while (&t. <=&j.);
%let r&t.=%str(xxx) xxx;
options remote=r&t. comamid=tcp debug='connect=xxx';
options metaserver="xxx"
metaport=xxx
metauser="xxx"
metapass="&PSW."
metaprotocol="bridge";
signon authdomain="xxx" wait=no Cmacvar=d&t.;
libname work_r&t. server=r&t. slibref=work;
options nolabel;
%let t = %eval(&t. + 1);
RDISPLAY r&t;
%end;
%mend open_sessions;
然后我执行几个
rsubmit r2;
...
endrsubmit;
rsubmit r3;
...
endrsubmit;
rsubmit r4;
...
endrsubmit;
最后:
WAITFOR _ALL_ r2 r3 r4; (after there is other code)
在这一点上,2种不同的情况在不同的运行中发生 1. SAS关闭,即关闭所有窗口,包括SAS本身,或 2. SAS无休止地等待,好像某个会话仍在运行,但实际上所有会话都已完成运行(即cmacvar变量都为= 0,并且已生成所有输出)。如果我尝试向会话提交其他代码,则会收到以下消息:“注意:当前正在执行一条显示语句。所有随后提交的语句将在其完成之前开始执行”。
如果我分别执行waitfor之前的代码,然后执行waitfor之后的代码,一切都会很好。
我已经尝试了sas.com提出的两种解决方案,当您收到“注意:一条显示语句正在执行...”消息时,但这没有用。这两种解决方案是:1.取消标记输出窗口的“显示新数据时显示在最前面”(已取消标记),2.重命名本地文件profile.sas7bcat和profile2.sas7bcat
我希望代码在有waitfor语句的情况下从头到尾平稳运行,然后在所有会话完成其任务后恢复运行
我该如何解决?