为工作程序goroutine对项目进行排队的正确方法?

为工作程序goroutine对项目进行排队的正确方法?,go,race-condition,channel,Go,Race Condition,Channel,我正在编写一个应用程序,允许用户上传文件并将其排队等待处理。我的方法是创建一个goroutine来处理上传的文件,并使用一个通道来表示新文件已准备好处理 基本上,处理goroutine执行以下操作: for { while itemForProcessing() { processNextItem() } select { case <-signalChan: case <-stopChan: return

我正在编写一个应用程序,允许用户上传文件并将其排队等待处理。我的方法是创建一个goroutine来处理上传的文件,并使用一个通道来表示新文件已准备好处理

基本上,处理goroutine执行以下操作:

for {
    while itemForProcessing() {
        processNextItem()
    }
    select {
    case <-signalChan:
    case <-stopChan:
        return
    }
}
用于{
而itemForProcessing(){
processNextItem()
}
挑选{

案例为避免信号丢失,请使用容量为1的通道。

此处通道用作可更新的标志-表示应用程序可以读取某些内容。我想这是一种简化的可能性-只需通过通道传递新对象即可。这解决了几个问题:简单的并行性、竞争条件保护、简化。
select {
case signalChan <- true:
default:
}