在测试我的项目时,我遇到了DATA RACE警告,想知道是否有人愿意帮助我解决问题。过去,我从未尝试过测试go例程,但发现很难在数据争用上全神贯注。
我在说明中提供了指向未解决问题的链接,并在问题说明中提供了跟踪信息。
从学习调试类似问题并为以后的go例程编写更好的测试方面,我将非常感谢您的帮助。
https://github.com/nitishm/vegeta-server/issues/52
下面也提供了跟踪的片段
for()
答案 0 :(得分:1)
据我了解:
Read at 0x00c0000f8d68 by goroutine 8:
和Previous write at 0x00c0000f8d68 by goroutine 7
表示goroutines 8
和7
都在同一位置读取和写入。如果您查看错误所指向的行:
goroutine 8
on 116
:
if t.status != models.AttackResponseStatusRunning {
goroutine 7
on 107
:
t.status = models.AttackResponseStatusRunning
您可以看到,goroutine正在访问task
的状态而没有任何同步,并且您已经知道,这可能会导致竞争状态。
因此,如果您的程序允许多个goroutine访问单个任务,则需要确保通过使用互斥锁来避免数据争用。