我正试图在Go语言中实现一个工作池。 go-wiki(和Channels部分的Effective Go)提供了完美的限制资源使用的示例。只需创建一个缓冲区大小等于工作池的通道,然后用工作人员填充该通道,在完成工作后将它们发送回该通道。从通道接收会阻塞直到有可用的工作人员。所以通道和循环就是整个实现 - 非常酷!
另外,也可以在向通道发送时进行阻塞,但是思路相同。
我的问题是如何在运行时更改工作池的大小。我不认为有一种方法可以改变通道的大小。我有一些想法,但其中大多数似乎过于复杂。 这个页面实际上使用了一个通道和空结构体来实现信号量,方法类似,但它也有同样的问题(在Google搜索“golang semaphore”时经常遇到这种情况)。