我正在努力理解MPConnect,以及如何将它用于并行处理。
作为一个简单的例子,我开始了一个会话,打印"Hello!“永远和另一个印着“再见的世界!”我说“等待任何”和"rget“,我希望”再见世界!“因为“你好世界!”在“再见世界”的时候将永远继续下去!已经结束了。不幸的是,这不起作用。
通常,我很难从远程提交的任务中检索输出。
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;发布于 2015-06-01 09:41:48
问题似乎是,当同步进程运行时,它们就完全断开了。尽管您只是在等待快速的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文档这里的详细信息部分。
编辑:
更多地,您可以使用统一的libname测试它们之间的连接(每个进程都有自己独特的工作libname,这样它们就不会相互冲突):
根据客户端机器上的需要分配libname和选项:
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 *** ;发布于 2015-06-02 15:00:09
问题是,正如您所说的,TASK1将永远运行。具体来说,这就是声明。
signoff task1;导致了你的特殊问题。正如你对提交过程说的,等待无限期的过程结束,然后签署.
如果你有
signoff task2;
killtask task1;您将看到您确实使用RGET从TASK2收集日志信息( SIGNOFF语句也将在不使用RGET的情况下收集日志信息)。在本例中,来自TASK1的信息丢失了,但是使用前面提到的选项(LOG="task1.log"),您可以单独恢复信息。
在这样的情况下,RGET语句不会等待一切完成。它将从请求时已完成的任何任务中收集它所能收集的内容,除非您特别请求RGET TASK1,在这种情况下,它将暂停。
https://stackoverflow.com/questions/30567288
复制相似问题