将 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))
我正在尝试将一个 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))