我一直在使用 RWLock 读取 mysql 数据库,但似乎以下代码在等待解锁时间歇性地锁定程序?
// Returns string value from key in table specified, third parameter should be set to false if it shouldn't be case senstive.
func (self *DBStore) GetString(table string, key string, vargs...interface{}) (output string) {
defer func() { fmt.Println("GETSTRING Freeing Mutex!") }()
self.mutex.RLock()
fmt.Println("GETSTRING Got Mutex!")
defer self.mutex.RUnlock()
self.Get(table, key, &output, vargs...)
return
}
// Retreive a value at key in table specified.
func (self *DBStore) Get(table string, key string, output interface{}, vargs...interface{}) (found bool) {
defer func() { fmt.Println("GET Freeing Mutex!") }()
fmt.Println("Requesting Mutex")
self.mutex.RLock()
fmt.Println("GET Got Mutex!")
defer self.mutex.RUnlock()
现在有了上面的内容,我可以看到我真的不需要在这里执行 RLock,我可以简单地删除它,但我的印象是读锁不应该干扰另一个读锁。而且它似乎是间歇性的,在它再次发生之前我通常需要运行几次相同的东西。
程序的输出是:
Requesting Mutex
GET Got Mutex!
GET Freeing Mutex!
GETSTRING Got Mutex!
Requesting Mutex
然后它就永远坐着,锁着。我在这里缺少什么?
如有任何信息,我们将不胜感激!
go版本go1.4 darwin/amd64
最佳答案
后来想想背靠背RLock的问题,有道理。
我在这里没有记录的是锁,现在很清楚的是在背靠背 RLock 之间出现锁的情况。
基本上锁是排队的。
(Thread 1) GetString -> Request Read Lock
(Thread 1) GetString -> Got Read Lock
(Thread 2) Set -> Request Write Lock (Blocked, queued.)
(Thread 1) Get -> Request Read Lock (Blocked, queued.)
来自 http://golang.org/src/sync/rwmutex.go?s=862:888#L19
34 if atomic.AddInt32(&rw.readerCount, 1) < 0 { 35 // A writer is pending, wait for it. 36 runtime_Semacquire(&rw.readerSem) 37 }
关于golang sync.RWLock 似乎会造成死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28081740/
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
运行:ruby1.9.3p0和Rails3.2.1尝试使用rspec但当我尝试将其安装到我的应用程序中时出现以下错误:/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/railtie/configuration.rb:85:in`method_missing':undefinedmethod`generators'for#(NoMethodError)from/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/rspec-rails-2.0.0.beta.18/lib/rspec-r
我一直在Heroku上尝试不同的缓存策略,并添加了他们的memcached附加组件,目的是为我的应用程序添加Action缓存。但是,当我在我当前的应用程序上查看Rails.cache.stats时(安装了memcached并使用dalligem),在执行应该缓存的操作后,我得到current和total_items为0。在Controller的顶部,我想缓存我有的Action:caches_action:show此外,我修改了我的环境配置(对于在Heroku上运行的配置)config.cache_store=:dalli_store我是否可以查看其他一些统计数据,看看它是否有效或我做错
我认为我对线程在ruby中的工作原理存在根本性的误解,我希望获得一些见解。我想要一个简单的生产者和消费者。首先,生产者线程从文件中提取行并将它们粘贴到SizedQueue中;当那些用完时,在末端贴上一些token,让消费者知道事情已经完成。require'thread'numthreads=2filename='edition-2009-09-11.txt'bq=SizedQueue.new(4)producerthread=Thread.new(bq)do|queue|File.open(filename)do|f|f.eachdo|r|queue现在有几个消费者。为简单起见,让
制作参数解析器。我想将一个字符串拆分为一个分隔符为","的数组除非前面有"|".这意味着字符串"foo,ba|,r,arg"应该导致`["foo","ba|,r","arg"]`我正在尝试使用这个正则表达式:(?适用于http://regexhero.net/tester/但是当我尝试args.split(/(?在ruby中,我得到一个错误:undefined(?...)sequence:/(? 最佳答案 Ruby的正则表达式引擎还不支持lookbehind。您需要切换到1.9或使用Oniguruma.如果这不是一个选项,您可以
这是设计使然吗?代码如下:classFileRenamerdefRenameFiles(folder_path)files=Dir.glob(folder_path+"/*")endendputs"Renamingfiles..."renamer=FileRenamer.new()files=renamer.RenameFiles("/home/papuccino1/Desktop/Test")putsfilesputs"Renamingcomplete."获取文件的顺序似乎是随机的,而不是它们在Nautilus中显示的那样。这是设计使然吗?我只是好奇。 最
这是我的代码,我试图用.to_sentence以句子形式显示指向bboy的工作人员的链接列表0)%>1)then"Crew".pluralizeelse"Crew"end%>:Independent我得到的输出是正确的链接,但它显示为:HustleKidzandKnuckleheadsCali而不是:HustleKidzandKnuckleheadsCali转义了html,而不是所需的链接。我错过了什么吗?我试过CGI.unescapeHTML和其他几个,但我迷路了...... 最佳答案 Rails3现在自动转义一切,为了输出原始H
在澄清了simplecov如何确定一条线是否已被测试执行之后。我有以下方法:defover?end_at其中end_at是对象的ActiveRecord属性。在以下规范中进行了练习:describeCalendarEntrydoit'candeterminethataneventhasended'do@entry.end_at=1.day.ago@entry.over?.shouldbe_trueendend在覆盖范围内运行规范后,它显示以下结果:我已经在Debug模式下运行了测试,并在此行上设置了一个断点,并确认规范确实符合它。这并不仅限于此方法中的这一行,包括使用ActiveRec
多年来,我一直使用RVM作为我的Ruby版本管理器,但为了简单起见,我想切换到rbenv。但是我在部署时发现了一些奇怪的问题。这是它似乎出错的地方:#envRBENV_ROOT=\"/home/deploy/.rbenv\"PATH=\"/home/deploy/.rbenv/shims:/home/deploy/.rbenv/bin:$PATH\"/home/deploy/.rbenv/bin/rbenvexecbundleinstall--gemfile/domains/myapp.com/releases/20140119013611/Gemfile--path/domains/
这让我发疯。我向Gemfile添加了一个gem(hirb),但现在无法部署。是的,我使用了bundleinstall--pathvendor/cache是的,我使用了bundlepackage是的,我提交了Gemfile和Gemfile.lock我删除了生产机器中的vendor/cache文件夹,这样它会再次生成它而不是更新它。这是错误的吗?每当我运行cap:deploy时,我都会得到以下...executing"cd/var/www/releases/20120606002321&&bundleinstall--gemfile/var/www/releases/20120606002