我正在尝试了解MPConnect以及如何将其用于并行处理。
作为一个简单的例子,我开始了一个打印“Hello World!”的会话。永远和另一个打印“再见世界!”。我说“等待任何”和“rget”,我期待“再见世界!”在日志中因为“Hello World!”将在“再见世界”中永远继续下去!已完成。不幸的是,这不起作用。
通常,从远程提交的任务中检索输出时遇到很大困难。
option cpucount=4 sascmd="!sascmd" autosignon;
rsubmit task1 wait=no;
data _null_;
do while(1);
put "Hello World!";
end;
run;
endrsubmit;
rsubmit task2 wait=no;
data _null_;
put "Bye World!";
run;
endrsubmit;
waitfor _any_;
rget;
signoff task1;
signoff task2;
答案 0 :(得分:1)
问题似乎是当你有同步进程运行时,它们彼此完全断开连接。即使你只是等待快速task2
完成才能继续:
rsubmit task2 wait=no;
data _null_;
put "Bye World!";
run;
endrsubmit;
SAS需要task1
才能完成最后的rget
:
rsubmit task1 wait=no;
data _null_;
do while(1);
put "Hello World!";
end;
run;
endrsubmit;
我认为发生的事情是SAS task2
满足waitfor _any_
条件并且能够在task2
之后继续进行处理。但是,rget
需要每个(已完成)进程的最终日志文件,然后才能将它们合并到客户端会话日志窗口中。
请查看SAS文档here的详细信息部分:
修改强>
多玩一点,您可以使用统一的libname测试它们之间的连接(每个进程都有自己唯一的工作libname,因此它们不会相互冲突):
在客户端计算机上根据需要分配libname和options:
libname testlib 'C:/test' ;
option cpucount=4 sascmd="!sascmd" autosignon;
定义两个并行运行的进程:
* Process 1 ;
rsubmit task1 wait=no;
libname testlib 'C:/test' ;
data testlib.test1 ;
do i=1 to 1000 ;
do j=1 to 1000;
output ;
end ;
end ;
run ;
endrsubmit;
* Process 2 ;
rsubmit task2 wait=no;
libname testlib 'C:/test' ;
data testlib.test2 ;
do i=1 to 1000 ;
output ;
end ;
run ;
endrsubmit;
然后,您可以拥有以下代码,该代码将在process1
仍在运行时运行,但它将能够访问process2
的输出数据集:
* Wait for either of the above processes and the process remaining code;
waitfor _any_;
proc sql noprint ;
select sum(i)
into :result
from testlib.test2
;quit ;
%put *** SUM OF TEST2 IS: &result *** ;
答案 1 :(得分:1)
问题是,就像你说的那样,TASK1将永远运行。具体来说就是声明
signoff task1;
这导致了您的特定问题。正如您所说的提交过程中等待无限期过程结束,然后签字......
如果你有了
signoff task2;
killtask task1;
您会看到您确实使用RGET从TASK2收集日志信息(SIGNOFF语句也将在没有RGET的情况下收集)。在这种情况下,来自TASK1的信息会丢失,但是已经提到了选项(LOG =" task1.log"),您可以单独恢复信息。
在这种情况下,RGET语句不会等待所有内容完成。除非您特别请求RGET TASK1,否则它将从请求时已完成的任何任务中收集它可以获得的内容,在这种情况下它会暂停。