亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在節奏工作流的循環內調用相同的活動

在節奏工作流的循環內調用相同的活動

Go
皈依舞 2022-07-04 10:42:34
我在 cadence 工作流程中有一個問題,我們可以在 for 循環中使用不同的輸入調用相同的活動嗎?該代碼將是確定性的嗎?如果執行工作流的工作人員在執行期間停止并稍后重新啟動,那么 cadence 在重新構建工作流時是否能夠重播事件。例如,我有以下代碼。   func init() {    workflow.RegisterWithOptions(SampleWorkFlow, workflow.RegisterOptions{Name: "SampleWorkFlow"})    activity.RegisterWithOptions(SampleActivity, activity.RegisterOptions{Name: "SampleActivity"})    activity.RegisterWithOptions(SecondActivity, activity.RegisterOptions{Name: "SecondActivity"})}// SampleWorkFlow commentfunc SampleWorkFlow(ctx workflow.Context, input string) error {    fmt.Println("Workflow started")    ctx = workflow.WithTaskList(ctx, sampleTaskList)    ctx = workflow.WithActivityOptions(ctx, conf.ActivityOptions)    var result string    err := workflow.ExecuteActivity(ctx, "SampleActivity", input, "string-value").Get(ctx, &result)    if err != nil {        return err    }    for i := 1; i <= 10; i++ {        value := i        workflow.Go(ctx, func(ctx workflow.Context) {            err := workflow.ExecuteActivity(ctx, "SecondActivity", input, value).Get(ctx, &result)            if err != nil {                log.Println("err=", err)            }        })    }    return nil}// SampleActivity commentfunc SampleActivity(ctx context.Context, value, v1 string) (string, error) {    fmt.Println("Sample activity start")    for i := 0; i <= 10; i++ {        fmt.Println(i)    }    return "Hello " + value, nil}// SecondActivity commentfunc SecondActivity(ctx context.Context, value int) (string, error) {    fmt.Println("Second  activity start")    fmt.Println("value=", value)    fmt.Println("Second activity going to end")    return "Hello " + fmt.Sprintf("%d", value), nil}在這里,第二個活動在 for 循環中被并行調用。我的第一個問題是,這段代碼是確定性的嗎?假設在循環 5 次迭代后,當 i = 5 時,執行此工作流的工作人員終止,如果工作流程在另一個工作人員中啟動,cadence 是否能夠重播事件?你能回答我的問題嗎?
查看完整描述

1 回答

?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

是的,這段代碼是確定性的。它不調用任何非確定性操作(如隨機或 UUID 生成)并用于workflow.Go啟動 goroutine。所以它是確定性的。代碼的復雜性在定義其確定性方面不起任何作用。


無關的尼特。無需在示例中使用 goroutine,因為ExecuteActivity調用已經通過返回 Future 實現了非阻塞。所以樣本可以簡化為:


func SampleWorkFlow(ctx workflow.Context, input string) error {


    fmt.Println("Workflow started")

    ctx = workflow.WithTaskList(ctx, sampleTaskList)

    ctx = workflow.WithActivityOptions(ctx, conf.ActivityOptions)


    var result string

    err := workflow.ExecuteActivity(ctx, "SampleActivity", input, "string-value").Get(ctx, &result)

    if err != nil {

        return err

    }


    for i := 1; i <= 10; i++ {

       workflow.ExecuteActivity(ctx, "SecondActivity", input, i)

    }

    return nil

}

請注意,此示例仍然可能不會按照您期望的方式執行,因為它完成了工作流,而無需等待活動完成。所以這些活動甚至都不會開始。


這是等待活動完成的代碼:


func SampleWorkFlow(ctx workflow.Context, input string) error {


    fmt.Println("Workflow started")

    ctx = workflow.WithTaskList(ctx, sampleTaskList)

    ctx = workflow.WithActivityOptions(ctx, conf.ActivityOptions)


    var result string

    err := workflow.ExecuteActivity(ctx, "SampleActivity", input, "string-value").Get(ctx, &result)

    if err != nil {

        return err

    }

    var results []workflow.Future

    for i := 1; i <= 10; i++ {

        future := workflow.ExecuteActivity(ctx, "SecondActivity", input, i)

        results = append(results, future)

    }

    for i := 0; i < 10; i++ {

        var result string

        err := results[i].Get(ctx, &result)

        if err != nil {

            log.Println("err=", err)

        }

    }

    return nil

}


查看完整回答
反對 回復 2022-07-04
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號