可能有一个简单的解决方案,但目前我无法理解它。也许有人可以帮助我。
所以我有以下问题:
我要完成N
个SAS工作。由于我的计算机上的资源太有限,无法同时启动所有N
个作业,我只想同时开始说k = 5
。每当一份工作完成,我想开始下一份工作。完成工作的顺序并不重要。
目前,我在开始下一个5之前完成所有k=5
个工作。
所以这是伪代码,我正在做的事情:
/*The following macro starts k threads*/
%macro parallel_processing(k);
options fullstimer autosignon=yes sascmd="sas -nonews -threads";
%global thread jj idlist;
/*These are the N ID numbers for the jobs*/
%let idlist = 1 2 3 4 5 ... N;
%let jj = 0;
%do %until(&jj.=N);
%do thread = 1 %to &k.;
%let jj = %eval(&thread.+&jj.);
%syslput thread = &thread;
%syslput jj = &jj.;
%syslput idlist = &idlist.;
rsubmit process=task&thread. wait=no sysrputsync=yes;
%let id =%scan(%trim(&idlist.),&jj.);
/*Do the job*/
%job(id);
endrsubmit;
%end;
/* HERE IS MY PROBLEM:
I want to wait for each job separately, and start a new one
with an increased id. So that constantly k threads are busy.
*/
/* Wait for all threads to finish */
waitfor _all_ %do thread = 1 %to &k.;
task&thread
%end;
/* GET RESULTS FROM THREADS */
%do thread = 1 %to (&k.);
rget task&thread;
%end;
/* SIGNOFF THREADS*/
%do thread = 1 %to (&k.);
signoff task&thread;
%end;
%end;
%mend parallel_processing;
%parallel_processing(k);
也许有人有个好主意,我将不胜感激!提前谢谢。
答案 0 :(得分:2)
使用waitfor _any_ ...
代替waitfor _all_ ...
:
您可以使用任何您喜欢的方法来跟踪当前有效的5个任务。