- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在针对我的 redigo 函数运行这个测试,看看它是否支持大量并发写入,这是代码
import (
"github.com/gomodule/redigo/redis"
"log"
"os"
)
// Redis connection pool
var RedisPool *redis.Pool
func InitPool() {
RedisPool = &redis.Pool{
MaxIdle: 80,
MaxActive: 12000,
Dial: func() (redis.Conn, error) {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
log.Printf("ERROR: fail init redis: %s", err.Error())
os.Exit(1)
}
return conn, err
},
}
}
func ClosePool() error {
return RedisPool.Close()
}
func Set(key string, val string) error {
// get conn and put back when exit from method
conn := RedisPool.Get()
defer conn.Close()
_, err := conn.Do("SET", key, val)
if err != nil {
log.Printf("ERROR: fail set key %s, val %s, error %s", key, val, err.Error())
return err
}
return nil
}
func TestManySets(t *testing.T) {
InitPool()
defer ClosePool()
var wg sync.WaitGroup
numOfOperations := 1000
for i := 0; i < numOfOperations; i++ {
wg.Add(1)
go func() {
err := Set("key", strconv.Itoa(i))
if err != nil {
t.Errorf("error when setting key value: %s", err)
}
wg.Done()
}()
}
wg.Wait()
result, err := Get("key")
if err != nil {
t.Errorf("error when getting key value: %s", err)
}
t.Logf("result: %s", result)
}
当使用 go test -run TestManySets/path/to/package -count 1 -v
运行测试时,我遇到了很多 EOF
错误;
当使用 -race
运行测试时,即 go test -race -run TestManySets/path/to/package -count 1 -v
我得到一个检测到大量数据竞争,任何人都可以向我指出我如何才能使事情正确吗?
下面是数据竞争日志:
ycx@DESKTOP-NBD349L:/mnt/c/Users/robbi/Projects/GoGameServer$ go test -race -run TestManySets visiontech.com/adapter -count 1 -v
=== RUN TestManySets
==================
WARNING: DATA RACE
Read at 0x00c00009ab10 by goroutine 7:
visiontech.com/adapter.TestManySets.func1()
/home/ycx/Projects/GoGameServer/src/visiontech.com/adapter/redis_test.go:48 +0x3c
Previous write at 0x00c00009ab10 by goroutine 6:
visiontech.com/adapter.TestManySets()
/home/ycx/Projects/GoGameServer/src/visiontech.com/adapter/redis_test.go:45 +0x14c
testing.tRunner()
/usr/local/go/src/testing/testing.go:865 +0x163
Goroutine 7 (running) created at:
visiontech.com/adapter.TestManySets()
/home/ycx/Projects/GoGameServer/src/visiontech.com/adapter/redis_test.go:47 +0x128
testing.tRunner()
/usr/local/go/src/testing/testing.go:865 +0x163
Goroutine 6 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:916 +0x65a
testing.runTests.func1()
/usr/local/go/src/testing/testing.go:1157 +0xa8
testing.tRunner()
/usr/local/go/src/testing/testing.go:865 +0x163
testing.runTests()
/usr/local/go/src/testing/testing.go:1155 +0x523
testing.(*M).Run()
/usr/local/go/src/testing/testing.go:1072 +0x2eb
main.main()
_testmain.go:62 +0x222
==================
--- FAIL: TestManySets (10.08s)
redis_test.go:62: result: 1000
testing.go:809: race detected during execution of test
FAIL
FAIL visiontech.com/adapter 10.098s
ycx@DESKTOP-NBD349L:/mnt/c/Users/robbi/Projects/GoGameServer$
redis_test.go 第 47 行是上面代码中 Set
发生的地方。
最佳答案
竞争是因为您的 for 循环正在更新 i
而您的 goroutines 正在同时读取 i
。解决这个问题的一种方法是将 i
传递到您的 goroutine 函数中:
for i := 0; i < numOfOperations; i++ {
wg.Add(1)
go func(i int) { // <----------- CHANGE THIS
err := Set("key", strconv.Itoa(i))
if err != nil {
t.Errorf("error when setting key value: %s", err)
}
wg.Done()
}(i) // <----------- AND THIS
}
这样你就不再对 i
有一个闭包,并且你的 goroutine 函数中的 i
是一个不同的值,可以读取(或写入)而不受来自外面。
这也解决了另一个错误,竞争检测器找不到:在 for
循环中,递增的变量被重新使用,这意味着您当前的版本实际上无意中使用了相同的 i
值在很多情况下,并跳过其他情况。参见 here有关更多信息。
关于go - Redigo 并发集导致数据竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58062032/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!