如何将多个参数传递给 Azure Durable Activity 函数
How to pass multiple parameters to Azure Durable Activity Function
我的编排器接收到一个有效载荷,该有效载荷包含需要与其他数据集一起传递给 activity 函数的指令。
如何将多个参数传递给一个 activity 函数?还是我必须将所有数据混合在一起?
def orchestrator_function(context: df.DurableOrchestrationContext):
# User defined configuration
instructions: str = context.get_input()
task_batch = yield context.call_activity("get_tasks", None)
# Need to pass in instructions too
parallel_tasks = [context.call_activity("perform_task", task) for task in task_batch]
results = yield context.task_all(parallel_tasks)
return results
perform_task
activity 需要来自 task_batch
的项目和用户输入 instructions
我在 function.json
中做了什么吗?
解决方法
不理想,但我可以将多个参数作为单个 Tuple
something = yield context.call_activity("activity", ("param_1", "param_2"))
然后我只需要在 activity 中引用正确的参数索引。
似乎没有教科书上的方法可以做到这一点。我选择给我的单个参数一个通用名称,例如 parameter
或 payload
.
然后在协调器中传递值时我是这样做的:
payload = {"value_1": some_var, "value_2": another_var}
something = yield context.call_activity("activity", payload)
然后在 activity 函数中,我再次解压它。
编辑:一些隐藏的文档似乎表明 https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=python
只是添加到@Ari 的精彩回答中,这里的代码将数据从客户端函数(在本例中为 HTTP 请求)一直传递到 activity 函数:
Client -> Orchestrator -> Activity
客户
async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
client = df.DurableOrchestrationClient(starter)
req_data = req.get_json()
img_url = req_data['img_url']
payload = {"img_url": img_url}
instance_id = await client.start_new(req.route_params["functionName"], None, payload)
logging.info(f"Started orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
管弦乐队
def orchestrator_function(context: df.DurableOrchestrationContext):
input_context = context.get_input()
img_url = input_context.get('img_url')
some_response= yield context.call_activity('MyActivity', img_url)
return [some_response]
Activity
def main(imgUrl: str) -> str:
print(f'.... Image URL = {imgUrl}')
return imgUrl
您可以使用 @dataclass 和 @dataclass_json class 装饰器输入和输出类型,像这样:
@dataclass_json
@dataclass
class Command:
param1: str
param2: int
@dataclass_json
@dataclass
class Result:
val1: str
val2: int
然后您可以在 Azure Functions 中使用它们,例如在 Activity 个中:
def main(input: DownloadFileRequest) -> DownloadFileResponse:
# function code
result: DownloadFileResponse = DownloadFileResponse("some", 123)
return result
这为您提供了干净的 API 和描述性代码。比使用字典更好的方法,至少对我而言。
我还建议将 dataclass-wizard
作为一个可行的选择,它也应该是 dataclasses-json 的更轻量级的替代方案;从某种意义上说,它更轻巧,因为它不使用 marshmallow
等外部库来生成模式。无论如何,它的 FWIW 性能也更好一些。
不幸的是,我并没有真正理解问题中概述的数据模式,因此我决定自己推出一个快速而肮脏的演示,所以请检查一下:
from dataclasses import dataclass
from dataclass_wizard import JSONWizard
@dataclass
class Batman(JSONWizard):
suit_color: str
side: 'Sidekick'
@dataclass
class Sidekick:
name: str
mood: str
# usage
bats = Batman.from_dict({'suitColor': 'BLACK',
'side': {'Name': 'Robin', 'mood': 'Mildly depressed'}})
print(repr(bats))
# prints:
# Batman(suit_color='BLACK', side=Sidekick(name='Robin', mood='Mildly depressed'))
print(bats.to_dict())
# prints:
# {'suitColor': 'BLACK', 'side': {'name': 'Robin', 'mood': 'Mildly depressed'}}
我的编排器接收到一个有效载荷,该有效载荷包含需要与其他数据集一起传递给 activity 函数的指令。
如何将多个参数传递给一个 activity 函数?还是我必须将所有数据混合在一起?
def orchestrator_function(context: df.DurableOrchestrationContext):
# User defined configuration
instructions: str = context.get_input()
task_batch = yield context.call_activity("get_tasks", None)
# Need to pass in instructions too
parallel_tasks = [context.call_activity("perform_task", task) for task in task_batch]
results = yield context.task_all(parallel_tasks)
return results
perform_task
activity 需要来自 task_batch
的项目和用户输入 instructions
我在 function.json
中做了什么吗?
解决方法 不理想,但我可以将多个参数作为单个 Tuple
something = yield context.call_activity("activity", ("param_1", "param_2"))
然后我只需要在 activity 中引用正确的参数索引。
似乎没有教科书上的方法可以做到这一点。我选择给我的单个参数一个通用名称,例如 parameter
或 payload
.
然后在协调器中传递值时我是这样做的:
payload = {"value_1": some_var, "value_2": another_var}
something = yield context.call_activity("activity", payload)
然后在 activity 函数中,我再次解压它。
编辑:一些隐藏的文档似乎表明 https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=python
只是添加到@Ari 的精彩回答中,这里的代码将数据从客户端函数(在本例中为 HTTP 请求)一直传递到 activity 函数:
Client -> Orchestrator -> Activity
客户
async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
client = df.DurableOrchestrationClient(starter)
req_data = req.get_json()
img_url = req_data['img_url']
payload = {"img_url": img_url}
instance_id = await client.start_new(req.route_params["functionName"], None, payload)
logging.info(f"Started orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
管弦乐队
def orchestrator_function(context: df.DurableOrchestrationContext):
input_context = context.get_input()
img_url = input_context.get('img_url')
some_response= yield context.call_activity('MyActivity', img_url)
return [some_response]
Activity
def main(imgUrl: str) -> str:
print(f'.... Image URL = {imgUrl}')
return imgUrl
您可以使用 @dataclass 和 @dataclass_json class 装饰器输入和输出类型,像这样:
@dataclass_json
@dataclass
class Command:
param1: str
param2: int
@dataclass_json
@dataclass
class Result:
val1: str
val2: int
然后您可以在 Azure Functions 中使用它们,例如在 Activity 个中:
def main(input: DownloadFileRequest) -> DownloadFileResponse:
# function code
result: DownloadFileResponse = DownloadFileResponse("some", 123)
return result
这为您提供了干净的 API 和描述性代码。比使用字典更好的方法,至少对我而言。
我还建议将 dataclass-wizard
作为一个可行的选择,它也应该是 dataclasses-json 的更轻量级的替代方案;从某种意义上说,它更轻巧,因为它不使用 marshmallow
等外部库来生成模式。无论如何,它的 FWIW 性能也更好一些。
不幸的是,我并没有真正理解问题中概述的数据模式,因此我决定自己推出一个快速而肮脏的演示,所以请检查一下:
from dataclasses import dataclass
from dataclass_wizard import JSONWizard
@dataclass
class Batman(JSONWizard):
suit_color: str
side: 'Sidekick'
@dataclass
class Sidekick:
name: str
mood: str
# usage
bats = Batman.from_dict({'suitColor': 'BLACK',
'side': {'Name': 'Robin', 'mood': 'Mildly depressed'}})
print(repr(bats))
# prints:
# Batman(suit_color='BLACK', side=Sidekick(name='Robin', mood='Mildly depressed'))
print(bats.to_dict())
# prints:
# {'suitColor': 'BLACK', 'side': {'name': 'Robin', 'mood': 'Mildly depressed'}}