将 Python 对象作为参数传递给“parfeval”中的函数

dle*_*eal 1 python parallel-processing matlab parfor

我正在尝试将一个 Python 对象作为参数传递给我正在后台使用 parfeval 进行评估的函数。Python对象是Python类的一个实例,我在下面详细介绍它。但是,为了重现该错误,我将使用 Python 字典进行举例...但是,仅使用 struct(pydict) 是行不通的,因为我会丢失 Python 类中的所有属性和方法。

\n

假设Python字典是

\n
o = py.dict(pyargs(\'soup\',3.57,\'bread\',2.29,\'bacon\',3.91,\'salad\',5.00));\n
Run Code Online (Sandbox Code Playgroud)\n

函数是

\n
function t = testFunc(x)\nt = x{\'soup\'};\nend\n
Run Code Online (Sandbox Code Playgroud)\n

如果我评估该函数,我会得到正确的答案:

\n
>> testFunc(o)\nans =\n3.5700\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果我使用parfeval,我会收到以下错误:

\n
>> f = parfeval(@testFunc,1,o);\n>> fetchOutputs(f)\nError using parallel.Future/fetchOutputs\nOne or more futures resulted in an error.\nCaused by:\nError using testFunc (line 2)\nInvalid or deleted object.\n
Run Code Online (Sandbox Code Playgroud)\n

是否有解决此错误的方法,这并不意味着我必须重新编码整个 Python 类?\n以下是我想要作为函数传递给的对象的预览parfeval

\n
clt = \n    Python Client with properties:\n    enforce_enums: 1\n    api_key: [1\xc3\x9745 py.str]\n    request_number: [1\xc3\x971 py.int]\n    logger: [1\xc3\x971 py.logging.Logger]\n    session: [1\xc3\x971 py.authlib.integrations.httpx_client.oauth2_client.OAuth2Client]\n    token_metadata: [1\xc3\x971 py.tda.auth.TokenMetadata]\n    <tda.client.synchronous.Client object at 0x000001ECA08EAE50>\n
Run Code Online (Sandbox Code Playgroud)\n

我在文档中没有发现任何限制说明parfeval函数输入不能是任何东西...\n https://www.mathworks.com/help/matlab/ref/parfeval.html

\n
\n

"X1,...,Xm \xe2\x80\x94 输入参数\n逗号分隔的变量或表达式列表...输入参数,指定为逗号分隔的变量或表达式列表"

\n
\n

Edr*_*ric 6

MATLAB->Python 支持的限制之一是 Python 对象无法序列化。parfeval(以及其他并行结构)需要序列化才能将数据从一个 MATLAB 进程传输到另一个进程。

您可以通过让每个工作人员直接构建数据结构并通过存储/访问它来解决这个问题parallel.pool.Constant,如下所示:

oC = parallel.pool.Constant(@() py.dict(pyargs('soup',3.57,'bread',2.29,'bacon',3.91,'salad',5.00)));
fetchOutputs(parfeval(@(c) c.Value{'salad'}, 1, oC))
Run Code Online (Sandbox Code Playgroud)