2013-04-22 4 views
3

Я пытаюсь работать с matlab через python, чтобы прототип системы, которую я разработал. Является ли mlabwrap способным обрабатывать многопроцессорность? Это может встретить как очень глупо, но я думал, что я мог бы сделать следующее:Mlabwrap multiprocessing

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 

Этот импорт только псевдонимами как mlab и mlab1 к тому же mlabwrap.mlab переменной, которая является переменной класса, проведение одного mlabwrap экземпляра, так что они, вероятно, и указывая на то же mlabwrap объекта и, таким образом, та же сессия Matlab даже если вы передадите их другим объектам процесса. (Если вы запускаете функцию один раз с помощью mlab и снова с mlab1 без объектов Process, вы делаете блокирующие вызовы и выполняете их последовательно, поэтому в рамках этого совместного сеанса Matlab выполняется только одна часть M-кода за раз, вместо этого параллельного выполнения.)

Чтобы это сработало, вам нужно запустить отдельный сеанс Matlab для каждого из ваших параллельных процессов. Вы можете сделать это, создав новый объект mlabwrap для каждого процесса, вместо того, чтобы повторно использовать mlab. Mlabwrap использует механизм Matlab Engine за кулисами; Я не знаю, поддерживает ли он запуск нескольких экземпляров ядра из одной программы или нет; engOpen documentation не указывается. Но если это так, использование нескольких объектов mlabwrap может предоставить его для вашего кода Python, потому что код mlabwrap.__init__ пытается открыть новый движок при его создании.

+0

Я пробовал это, возможно, так оно и есть, но мне все равно понадобится основная ошибка mlabwrap, которая не сможет работать в процессе (здесь возникает ошибка выше, и я получаю ее независимо от того, не я вызываю другой процесс. Пока я использую mlabwrap в процессе один раз, я получаю эту ошибку, и никакие вычисления не выполняются) – Mark

+0

Возможно, вам удастся обойти это, создав объект 'mlabwrap' внутри рабочего процесса, а не создавая его в основном (вызывающем) процессе и передавая его как объект. Таким образом, библиотека Matlab Engine будет загружена и инициализирована в том же процессе, что и последующие вызовы Matlab. Возможно, вы можете развернуть «многопроцессорный» рабочий, каждый из которых загружен в модуль Matlab, а затем отправить их Matlab Запросы. Попросите каждого запустить функцию, которая инициализирует mlabwrap, а затем читает очередь или что-то для функций, которые будут применяться к ней. –