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
}
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報