我怎么能等待多个信号在同一个通道在时间golang

0qx6xfy6  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(117)

我的工作流中有一个切片,需要等待,直到我在同一个信号通道上接收到切片中每个元素的信号。我尝试使用以下代码,但它似乎没有等待接收到所有消息。

selector := workflow.NewSelector(ctx)
        notificationSignalChan := workflow.GetSignalChannel(ctx, "my-channel")

        for i := 0; i < len(container.Items); i++ {
            if container.Items[i].Status != status.Pending {
                continue
            }

            var expectedNotification events.Notification

            selector.AddReceive(notificationSignalChan, func(c workflow.ReceiveChannel, more bool) {
                // So it has to be explicitly consumed here
                c.Receive(ctx, &expectedNotification)
                idx := slices.IndexFunc(container.Items, func(item *model.Item) bool {
                    return item.ID == notification.ItemID
                })
                
                recordedAt := workflow.Now(ctx)
                container.Items[idx].Status = status.Processed
                err = workflow.ExecuteActivity(ctx, activities.OnProcessed, container.Items[idx]).Get(ctx, nil)
                
                if err != nil {
                    panic(err)
                }
            })
        }
        
        for i := 0; i < len(container.Items); i++ {
            if container.Items[i].Status != status.Pending {
                continue
            }

            selector.Select(ctx)
        }
ttp71kqs

ttp71kqs1#

你可以有一个死循环和一个select语句,这样当你从channel得到一个对象时,只要和list中的项比较,然后从list中删除那个项,检查list中是否有任何项,continue else,只要中断for循环。

for {
    select {
    case data := <-signal:
        for idx, obj := range lst {
            if data == obj {
                // do your staff
                fmt.Println(data)

                // remove that item from list
                if len(lst) <= 1 {
                    return
                }
                lst = append(lst[:idx], lst[idx+1:]...)
                // break the inner loop
                break
            }
        }
    }
}

相关问题