SAS中的并行处理,等待免费会话

时间:2015-06-12 00:17:13

标签: sas

说我签了2个会话:

signon slave1;
signon slave2;

说我有

执行的10个工作
%execute_job( parameter= 1);
%execute_job( parameter= 2);
%execute_job( parameter= 3);
.
.
.
%execute_job( parameter= 10);

我需要在%execute_job中添加什么才能继续等待免费会话并将作业提交给它找到的第一个免费会话?

我尝试了macvar的东西无济于事。

2 个答案:

答案 0 :(得分:3)

考虑一下: 我在登录时使用cmacvar选项将本地宏var专用于远程会话状态。 在syslput中,我在两个从属服务器上创建了远程my_id宏变量,以便他们知道"他们是谁"。

然后我有%job macro接收slave的ID来运行一些代码。对于现实世界,还应该有一些工作参数。在这里,我只是模拟较短的job1和较长的job2。

在%run_jobs中我做了一些循环尝试多次运行从属。 重点是在WAITFOR _ANY_声明中等待你。

signon slave1 sascmd="!sascmd" cmacvar=slave1; 
signon slave2 sascmd="!sascmd" cmacvar=slave2; 

%syslput my_id=1 /remote=slave1;
%syslput my_id=2 /remote=slave2;

rsubmit slave1;
options nomprint nosource nonotes;
endrsubmit;
rsubmit slave2;
options nomprint nosource nonotes;
endrsubmit;
/*
my_id is remote
slave_id is local
*/;
%macro job(slave_id);
rsubmit slave&slave_id. wait=no;
    data _null_;
         %if &slave_id eq 2 %then %do;
            x = sleep(2);
         %end;
         x = sleep(4);
         s = put(DATETIME(), DATETIME.) || " at &my_id.!";
        putlog s;
    run;
endrsubmit;
%mend;


%macro run_jobs;
    %do i=1 %to 4;
        %if &slave1 eq 0 %then %do;
            %put Slave1 starting;
            %job(1)
        %end;
        %else %put Slave1 working;
        %if &slave2 eq 0 %then %do;
            %put Slave2 starting;
            %job(2)
            %put Slave2: &slave2;
        %end;
        %else %put Slave2 working;
        WAITFOR _any_ slave1 slave2;
        *LISTTASK _ALL_ ;
        %put at end of loop &i:;
        %put Slave1: &slave1;
        %put Slave2: &slave2;
    %end;
%mend;


options nomprint nosource nonotes;
%run_jobs

signoff slave1;
signoff slave2;

答案 1 :(得分:1)

好吧,我想我得到了一些东西:

options sascmd="!sascmd";


%macro job(value);

    %local slave_id;

    %let slave_id = 1;

    %do  %while(&&slave&slave_id.);
        %put Slave&slave_id. is busy and cannot be assigned job;

        %if &slave_id. < 2  %then
            %let slave_id = %eval(&slave_id. + 1);
        %else 
            %let slave_id = 1;
    %end;

    %put Slave&slave_id. is free and is assigned job;

    %syslput _user_ /remote= slave&slave_id.;

    rsubmit slave&slave_id. macvar=slave&slave_id. wait=no;


        data _null_;

            file print;
            put "&value. by &slave_id.!";

        run;

    endrsubmit;

%mend job;

signon slave1 macvar=slave1;
signon slave2 macvar=slave2;

%job(6);

%job(7);

%job(8);

signoff slave1;
signoff slave2;