天天看點

帶你讀《SAS資料分析開發之道 軟體品質的次元》第三章通信交流3.5并行處理通信交流(一)

并行處理通信交流

傳回碼對軟體性能至關重要,但它們僅在單個SAS會話中可行。一旦會話終止,傳回碼和其他所有的宏變量均會消除。在使用SYSTASK指令大量生産批作業的複雜軟體設計中,或者在 SAS會話并行運作且必須互相交流的運作環境中,傳回碼是無 用的。相反,交叉會話交流需要互斥、信号量、控制表及SYSPARM參數。第 11章将介紹并行進行中存在的其他通信交流複雜性。

互斥和信号量

信号量是一個通過訓示某個動作已經完成或者某個事件已經發生來實作并行程式同步化的共享變量。信号量是辨別,代表軟體中的事件或條件,且通常由變量表示。在 SAS軟體中,由于宏變量不能被多個 SAS程式讀取,是以,必須使用檔案或資料集作為各個會話之間傳遞資訊的信号量,類似于海軍艦艇之間傳遞的旗幟信号。信号量最常見的用途之一是标示某個對象是處于可供使用的狀态還是正在使用的狀态。

在某些情況下,一個對象一次僅能供一個程式使用,例如,當要求專用鎖定用于擷取和修改某個SAS資料集時。互斥信号量(或互斥量)代表一類信号量,這類信号量能確定某些對象的互斥通路,且被定義為“一個實作互斥的機制”。互斥量不僅 能確定目前資料集的使用是被标記的,還能確定其他程式在标記被檢測到的情況下無法幹擾其使用。在前述“&SYSLCKRC”部分LOCK程式指令中,由于存在不一緻性,是以,需要用互斥來獨家鎖定一個資料集以促進并行進行中會話之間的通信交流。

在本例中,“互斥”是一個建立的空白文本檔案,同樣命名為一個資料集。如果存在“互斥”(如文本檔案)且其未被任何SAS會話鎖定,那麼目前SAS會話将鎖定該“互斥”,随後便能夠安全地通路相關的資料集;若不需要資料集通路,“互斥”鎖定就會被解除。如果SAS會話遇到一個被鎖定的“互斥”,那麼異常情況處理将阻止對相關資料集的通路。這一邏輯使兩個或多個并發的SAS會話輪流擷取資料集,而無須擔心出現檔案通路沖突或“運作時錯誤”。

在 SAS 的一個會話中運作以下代碼以說明“互斥”的用途。

libnameperm'c:\perm';

dataperm.test;lengthchar1$10;

run;

%macromutex(dsn=/*inLIB.DSNformat*/,cnt=/*numberofiterationstorun*/);

%locallib;

%localtab;

%localclosed;

%localdsid;

%letlib=%scan(&dsn,1);

%lettab=%scan(&dsn,2);

%letloc=%sysfunc(pathname(&lib))\&tab..txt.lck;

filenamemyfil"&loc";

%doi=1%to&cnt;

%letdsid=%sysfunc(fopen(myfil,u));

%if&dsid>0%then%do;

data&dsn;set&dsn;

%letclosed=%sysfunc(fclose(&dsid));

%end;

%mend;

%mutex(dsn=perm.test,cnt=1000);

在另一個 SAS會話中,立即執行 LIBNAME程式指令和%MUTEX宏(但不是DATA步驟),以便使兩個會話并行運作。程式将建立“互斥”(文本檔案C:\perm\ test.txt.lck),兩個會話會不斷地試驗該“互斥”以擷取PERM.Test資料集。隻有當一個會話能獨家鎖定“互斥”時,才能執行後續的 DATA 步驟,進而防止因通路沖突而出現的“運作時錯誤”。

控制表

控制表指的是從外部存儲到程式代碼中的資料,該程式代碼的作用是幫助資料驅    動處理過程,通常是促進雙向交流——軟體把資料寫入控制表同時也從中讀取資料。    在 SAS文獻中,控制表有時也稱為“控制資料集”。這是 SAS專用術語,該術語不使用相關資料庫術語“表”而是使用“資料集”。除了包含動态驅動程式流的資料之外,某些控制表還收集過程中的性能名額,有時反過來還會使用這些名額來驅動下一個處    理程式。是以,盡管一些控制表包含足夠的資訊訓示程式流,但有些控制表還會包含    以往的性能資料。第 7章中的表 7-1及第 9章中的表 9-1展示了控制表示例。

控制表和配置檔案均能動态驅動程式流,增強靈活性,減少寫死,提升可用性。然而,配置檔案是比較重要的,因為通信流隻能從配置檔案裝入軟體。另外,通常僅    在軟體初始化過程中讀取配置檔案,而控制表在軟體運作的整個過程中均可以讀取。    配置檔案更傾向于手動更新,這樣一來,軟體在下次運作的過程中會産生不同的結果,而控制表通常是在軟體運作過程中建立和修改的。第 17章會介紹配置檔案。

由于宏變量不能在并行運作的獨立 SAS會話中傳輸,是以,控制表能夠促進交叉會話之間的交流,使每個會話中的軟體在同一控制表中輪流丢棄和檢索資訊。資料集的修改要求專用鎖定,而且如果兩個以上的使用者或程式試圖同時通路同一個   SAS資料集,便會出現檔案通路沖突。基于以上兩個原因,并行程式運作中必須執行“互   斥”以避免沖突和“運作時錯誤”。“互斥”在前面部分已做介紹。在第   7    章會講述使用控制表支撐并行處理。

控制表的另一個用途是将資料和中繼資料從子程序傳回到父程序。若 SYSTASK程式指令用于建立批處理流程,除父程序之外,子程序會在一個新的SAS會話中大量生成。盡管父程序能夠通過SYSPARM參數将資訊傳達給子程序(下一部分介紹),但子程序無法越過會話邊界将資料或中繼資料傳回到父程序中。出于這個原因,與控制    表促進并行處理的方法相類似,子程序批量處理過程能将資料和中繼資料彙總到一個控    制表中,父程序稍後可檢索該控制表以驗證批量程式的順利執行,并檢索其他資料或    輸出資訊。

當一個批處理流程在SYSTASK大量生産且子程序出現警告或“運作時錯誤”,父程序将會通過&SYSRC 宏變量獲得這一資訊。&SYSRC 宏變量在前面已講過。另外,第 11章會對該變量進行詳細介紹。由于跟在SYSTASK後面的 &SYSRC數值有限,能夠傳達的有效資訊較少,自定義異常情況處理架構通常必須能夠檢測和回應批處理    過程出現的警告或“運作時錯誤”。