2013-04-22 71 views
3

我想通過python使用matlab來創建我開發的系統的原型。 mlabwrap是否能夠處理多處理?這可能會遇到非常愚蠢的,但我想我可以做到以下幾點:Mlabwrap多處理

from multiprocessing import Process,Lock 
from mlabwrap import mlab 
from mlabwrap import mlab as mlab1 

def some_Function(mlab,Astring) 
    #do some stuff.... 

p1=Process(target=some_Function,args=(mlab,"Example string 1")) 
p2=Process(target=some_Function,args=(mlab1,"Example string 2")) 
p1.start() 
p2.start() 

,但我不斷收到此錯誤:

Traceback (most recent call last): 
    File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap 
    self.run() 
    File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
    File "test.py", line 15, in process_Camera 
    res=mlab.RetrieveAndProcess(cameraDirectory) 
    File "/home/mar608/data/cameraSystem/mlabwrap-1.1/build/lib.linux-x86_64-2.6/mlabwrap.py", line 607, in mlab_command 
    return self._do(name, *args, **update({'nout':nout}, kwargs)) 
    File "/home/mar608/data/cameraSystem/mlabwrap-1.1/build/lib.linux-x86_64-2.6/mlabwrap.py", line 515, in _do 
    mlabraw.eval(self._session, "cd('%s');" % os.getcwd().replace("'", "''")) 
error: Unable to evaluate string in MATLAB(TM) workspace 

注意,當我跑我沒有得到這個錯誤只是定期的功能,即使我用mlab運行一次函數,再用mlab1運行一次。只有當我將它作爲一個進程運行時纔會發生,並且無論我是否使用它運行另一個進程,它都會發生。

任何提示將不勝感激!

請注意,這發生在所有matlab函數中。例如,調用mlab.sum([2,3])也會給出相同的錯誤

注意: 我知道我不應該爲我的代碼的最終產品做這種事情。我不會在最終版本中這樣做,我只想得到一個演示工作。

回答

1

Matlab本身是M代碼級別的單線程 - 也就是說,M代碼解釋器只能處理單個併發的M代碼執行 - 所以你將無法在一個單一的內部進行併發處理Matlab程序。

from mlabwrap import mlab 
from mlabwrap import mlab as mlab1 

這只是進口別名都mlabmlab1相同的mlabwrap.mlab變量,它是一個類變量單持有mlabwrap實例,因此他們很可能都在同一mlabwrap對象,因此相同的Matlab的會議指出即使將它們傳遞給不同的Process對象也是如此。 (如果你用mlab運行一次函數,再用mlab1運行沒有Process對象的函數,那麼你正在進行阻塞調用並按順序執行它們,所以在共享的Matlab會話中,一次只運行一段M代碼,而不是併發執行。)

爲了使這個工作,你需要爲每個並行進程啓動一個單獨的Matlab會話。您可以通過爲每個進程創建一個新的mlabwrap對象來實現此目的,而不是僅僅重用mlabMlabwrap在幕後使用Matlab引擎;我不知道它是否支持從單個程序運行多個引擎實例, engOpen documentation沒有指定。但是如果是這樣,使用多個mlabwrap對象可能會暴露它爲您的Python代碼,因爲mlabwrap.__init__代碼嘗試在構建時打開一個新的引擎。

+0

我試過了,可能是這種情況,但是我仍然需要mlabwrap不能在一個進程中運行的基礎錯誤(這是上述錯誤的來源,我得到它,無論是否不是我調用另一個進程,只要我在一個進程中使用mlabwrap,我得到這個錯誤,並且沒有計算運行) – Mark 2013-04-22 18:46:36

+0

你可以通過在工作進程中構建'mlabwrap'對象來取代在主(調用)過程中構造它並將其作爲對象傳遞。那樣的話,Matlab Engine庫就會被加載並初始化到後面的Matlab調用所發生的相同的過程中。也許你可以啓動一個worker的multiprocessing.Pool,每個都加載Matlab引擎,然後將它們發送給Matlab要求。讓每個人都運行一個函數來初始化一個mlabwrap,然後讀取一個隊列或其他函數來應用它。 – 2013-04-22 20:02:39