最近在除錯乙個演算法,想通過改變演算法的引數看看結果有什麼變化。 碰到乙個麻煩的事情是,從磁碟載入、構建資料需要15分鐘。這就比較討厭了,也就是說我每次調乙個引數前都要等15分鐘啟動時間?
於是我就想,能不能開乙個datahost程序專門載入資料。我在別的程序除錯引數,但需要用資料時就直接從datahost程序中載入現成的資料。 這樣的話我只需要從磁碟載入一次資料。 於是找了一下, c#有個叫ipc(inter process communication)的功能可以實現同一臺機器上的不同程序間通訊。
注意我這裡的scenario:我需要程序間通訊「資料物件」, 而不是訊息。 通訊訊息比較好辦,就傳乙個string流就行了。而我需要傳遞的是資料物件,比如乙個dictionary, 或者自定義class。
ipc的大致過程是這樣的:datahost程序先繫結乙個物件,client根據物件的uri去訪問物件類, 並且呼叫該類的方法。datahost程序接收到從client發來的呼叫,就會例項化乙個物件(注意,在這個時候才開始例項化乙個物件,這也是我的**裡使用static的原因),並且執行相關的函式,再把結果返回給client。 注意執行過程是在datahost端的。
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
ipcserver
public dictionarygetsalary()
public
dataobj()
", dataobj.constructercnt);}}
}
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.runtime.remoting;
using
system.runtime.remoting.channels;
using
system.runtime.remoting.channels.ipc;
using
system.text;
using
system.threading.tasks;
namespace
ipcserver
}}
usingipcserver;
using
system;
using
system.collections.generic;
using
system.linq;
using
system.runtime.remoting.channels;
using
system.runtime.remoting.channels.ipc;
using
system.text;
using
system.threading.tasks;
namespace
ipcclient
", t);
try
catch
(exception e)
if (obj == null
)
else,"
, pair.key, pair.value);
}console.writeline(
"counter =
", obj.getsalary());
dataobj.counter++;}}
console.writeline(
"mission complete!");
console.readkey();}}
}
事實上結果並沒有加速。估計ipc也是把物件序列化後傳遞,再反序列化的吧。 桑心。
next steps: 尋找一種直接讀其他程序的記憶體空間的途徑。。。
轉至:
程序間通訊IPC
這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...
程序間通訊 IPC
part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...
程序間通訊IPC
乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...