我正试图通过python与matlab一起工作,来实现我开发的系统的原型。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])也会给出相同的错误
注:
我知道我不应该为了代码的最终产品而做这种事情。我不会在最终版本中这样做,我只是想让一个演示工作。
最佳答案
Matlab本身在M代码级别是单线程的——也就是说,M代码解释器只能处理一个并发的M代码执行——因此您将无法在单个Matlab进程中执行并发处理。
from mlabwrap import mlab
from mlabwrap import mlab as mlab1
这个导入只是将
mlab
和mlab1
都别名为同一个mlabwrap.mlab
变量,这是一个包含单个mlabwrap
实例的类变量,因此它们可能都指向同一个mlabwrap对象,因此即使将它们传递给不同的进程对象,也会指向同一个Matlab会话。(如果用mlab运行函数一次,再用mlab1运行函数而不使用进程对象,则会进行阻塞调用并按顺序执行,因此在共享的Matlab会话中,一次只运行一段M代码,而不是并发执行。)要使其工作,您需要为每个并行进程分别启动一个Matlab会话。您可以通过为每个进程创建一个新的
mlabwrap
对象来实现这一点,而不仅仅是重用mlab
。Mlabwrap
在幕后使用Matlab引擎;我不知道它是否支持从单个程序运行多个引擎实例;engOpen
documentation没有指定。但是如果是这样,使用多个mlabwrap
对象可能会为您的Python代码公开它,因为mlabwrap.__init__
代码在构造新引擎时会尝试打开它。