我几乎已经实现了面部识别Go服务器。我的人脸识别算法使用caffe
,caffe
是一个线程绑定图形库,这意味着我必须在同一个线程中初始化并调用算法,所以我检查了LockOSThread()。
LockOSThread
使用1个线程,但我的服务器拥有4个GPU。
在C/C++
中,我可以创建4个线程,在每个线程中初始化算法,使用sem_wait
和sem_post
分配任务,1个线程使用1个GPU。
如何在Go
中做同样的事情,如何用线程绑定代码?
答案 0 :(得分:2)
你生成一些的goroutines,每个都运行runtime.LockOSThread()
然后在每个图形库中初始化。
然后使用常规Go通信原语向这些原语发送任务 够程。通常,最简单的方法是让每个goroutine读取"任务"来自频道并发回结果,如
type Task struct {
Data DataTypeToContainRecognitionTask
Result chan<- DataTypeToContainRecognitionResult
}
func GoroutineLoop(tasks <-chan Task) {
for task := range tasks {
task.Result <- recognize(Data)
}
}
tasks := make(chan Task)
for n := 4; n > 0; n-- {
go GoroutineLoop(tasks)
}
for {
res := make(chan DataTypeToContainRecognitionResult)
tasks <- Task{
Data: makeRecognitionData(),
Result: res,
}
result <- res
// Do something with the result
}
至于确定要开始多少goroutines,存在不同
策略。
最简单的方法可能是查询runtime.NumCPU()
并使用此号码。