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



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

假设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类?这是我想作为函数传递给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—输入自变量逗号分隔的变量或表达式列表。。。输入参数,指定为变量或表达式的逗号分隔列表";

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))

相关内容

  • 没有找到相关文章

最新更新