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

Pass Python object as argument to function in "parfeval"

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

假设 Python 字典是

o = py.dict(pyargs('soup',3.57,'bread',2.29,'bacon',3.91,'salad',5.00));

函数是

function t = testFunc(x)
t = x{'soup'};
end

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

>> testFunc(o)
ans =
3.5700

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

>> f = parfeval(@testFunc,1,o);
>> fetchOutputs(f)
Error using parallel.Future/fetchOutputs
One or more futures resulted in an error.
Caused by:
Error using testFunc (line 2)
Invalid or deleted object.

是否有解决此错误的解决方法,这并不意味着我必须重新编码整个 Python class? 这是我想作为函数传递给 parfeval:

的对象的预览
clt = 
    Python Client with properties:
    enforce_enums: 1
    api_key: [1×45 py.str]
    request_number: [1×1 py.int]
    logger: [1×1 py.logging.Logger]
    session: [1×1 py.authlib.integrations.httpx_client.oauth2_client.OAuth2Client]
    token_metadata: [1×1 py.tda.auth.TokenMetadata]
    <tda.client.synchronous.Client object at 0x000001ECA08EAE50>

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

"X1,...,Xm — Input arguments comma-separated list of variables or expressions... Input arguments, specified as a comma-separated list of variables or expressions"

其中一个limitations of the MATLAB->Python support是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))