jjzjj

time - 戈朗 : throttle (time delay) function is not working in goroutine (works fine in main thread)

coder 2024-07-06 原文

所以我正在编写一个实用程序来查询工作中的 API,它们将每 10 秒限制为 20 次调用。很简单,我会将我的通话时间限制在自上次通话后至少 0.5 秒。在我尝试使用 goroutine 之前,我的 Throttle 实用程序运行良好。

现在我正在使用结构/方法组合:

func (c *CTKAPI) Throttle() {
if c.Debug{fmt.Println("\t\t\tEntering Throttle()")}
for { //in case something else makes a call while we're sleeping, we need to re-check
    if t := time.Now().Sub(c.LastCallTime); t < c.ThrottleTime {
        if c.Debug{fmt.Printf("\t\t\tThrottle: Sleeping %v\n", c.ThrottleTime - t)}
        time.Sleep(c.ThrottleTime - t)
    } else {
        if c.Debug{fmt.Println("\t\t\tThrottle: Released.")}
        break
    }
}
c.LastCallTime = time.Now()
if c.Debug{fmt.Println("\t\t\tExiting Throttle()")}

然后我在每个 goroutine 中的每次调用之前调用 whatever.Throttle() 以确保我在启动下一个调用之前至少等待了半秒。

但这似乎是不可靠的并且给出了不可预知的结果。是否有更优雅的方式来限制并发请求?

-迈克

最佳答案

因为您要引入数据竞争,所以多个例程正在访问/更改 c.LastCallTime。

您使用 time.Tick或者将 c.LastCallTime 设为 int64 (c.LastCallTime = time.Now().Unix()) 并使用 atomic .LoadInt64/StoreInt64 进行检查。

关于time - 戈朗 : throttle (time delay) function is not working in goroutine (works fine in main thread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357556/

有关time - 戈朗 : throttle (time delay) function is not working in goroutine (works fine in main thread)的更多相关文章

  1. ruby - Time.to_i 是否总是以 UTC 返回自 EPOCH 以来的秒数? - 2

    无论时间在哪个时区表示,时区差异是否总是被忽略?直觉上,对于那些使用UTC+2的人来说,从EPOCH开始经过的秒数应该更高。然而,事实并非如此。 最佳答案 Epoch基于utc时区https://en.wikipedia.org/wiki/Unix_time它与您当前所在的时区无关。 关于ruby-Time.to_i是否总是以UTC返回自EPOCH以来的秒数?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.

  2. ruby - Ruby Time#dst 如何运行? - 2

    这可能是一个愚蠢的问题,表明我对夏令时的基础知识缺乏了解,但根据标题,Time.dst?如何知道时间对象确实是真还是假?大概这必须通过日期和时区的组合来辨别,但这没有意义,因为时区中的低纬度不使用夏令时?因此肯定它必须需要位置来识别#dst??我错过了什么? 最佳答案 为了处理时区和夏令时,Ruby和其他所有东西一样,是callinglocaltime_rCfunction.这将时间放入名为tm的C结构中其中包括一个名为isdst的字段。Ruby正在读取该标志。localtime_r首先通过从全局tzname变量获取您的时区来计算i

  3. 已解决socket.timeout : The read operation timed out - 2

    已解决(pip安装模块超时,利用四种国内镜像源完美解决)WARENTING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby‘ConnectTimeoutError(pip._vendor.urllib3.connection.HTTPSConnectionobjectatOx00001D6OE4F4A940>,‘Connectiontopypi.orgtimedout.(connecttimeout=15)’)’':/simple/pip/socke

  4. Ruby,从 Date.day_fraction_to_time 获取小时、秒和时间 - 2

    我找到了这个方法here.start=DateTime.nowsleep15stop=DateTime.now#minutesputs((stop-start)*24*60).to_ihours,minutes,seconds,frac=Date.day_fraction_to_time(stop-start)我有以下错误:`':privatemethod`day_fraction_to_time'calledforDate:Class(NoMethodError)我检查了/usr/lib/ruby/1.9.1/date.rb并找到了它:defday_fraction_to_time(

  5. ruby-on-rails - 运行 rake db :seed multiple times without creating duplicate records? - 2

    这个问题在这里已经有了答案:appendingtorakedb:seedinrailsandrunningitwithoutduplicatingdata(9个回答)关闭9年前。我想更改种子文件中的一些代码,以便在我多次运行种子命令时它不会创建重复记录。有什么方法可以从我的种子文件中修改下面的代码,这样就可以了吗?除非我弄错了,否则find_or_create_by方法在这里似乎不起作用。data_file=Rails.root.join('db/data/data.csv')CSV.foreach(data_file)do|row|TownHealthRecord.create(ci

  6. ruby - 为什么 6.times.map 在 ruby​​ 1.8.7 而不是 1.8.6 中工作 - 2

    以下代码片段在MacOSX的1.8.7中运行良好,但在Ubuntu的1.8.6中运行不佳。为什么?有解决方法吗?适用于1.8.7:$ruby--versionruby1.8.7(2009-06-08patchlevel173)[universal-darwin10.0]ltredgate15:eeglleem$irb>>6.times.map{'foo'}=>["foo","foo","foo","foo","foo","foo"]>>但在1.8.6中没有:#ruby--versionruby1.8.6(2008-08-11patchlevel287)[i686-linux]RubyE

  7. ruby-on-rails - 如何从此 instagram json 获取 created_time? - 2

    我得到了这个json和created_time值以integer格式显示时间,而不是及时格式,但我希望这个created_time格式正确。如何以正确的格式获取created_time?"filter"=>"Normal","created_time"=>"1421677966","link"=>"http://instagram.com/p/yCfw5sKorK/","likes"=>{"count"=>1,"data"=>[{"username"=>"nikhil.thombare","profile_picture"=>"https://instagramimages-a.aka

  8. ruby-on-rails - Ruby on Rails + Sidekiq : How do I change a scheduled job start time? - 2

    我最近开始使用Sidekiq并注意到它有一个我一直在寻找的很棒的功能:UserMailer.delay_until(5.days.from_now).find_more_friends_email基本上我可以在未来安排工作,所以我不需要我的应用程序持续轮询具有开始时间的新事件。现在这很有用,但我如何更改作业的开始时间?通常一些预定的事件会更改其开始时间。我如何在sidekiq中复制它?我知道我可以删除作业并创建一个新作业,但是否可以只修改开始时间?编辑:我建立在OtoBrglez的想法之上,这里是记录的代码:moduleTaskStuffclassTaskSetterincludeSi

  9. Ruby Time#to_date() 方法返回错误的日期 - 2

    我们使用的是Ruby1.9.3,我发现Time#to_date似乎是一个奇怪的Ruby错误Time.new(1).to_date在应返回0001年1月1日时返回0001年1月3日。我无意中发现了这个问题。似乎如果我调用.to_datetime.to_date,结果是正确的。我还发现了一些其他相关的怪异之处。请参阅下面的irb控制台输出。(请注意,我使用的是irb,而不是railsconsole,以确保我使用的只是Ruby,不是Rails的任何附加内容。)>>require"Time"=>true>>Time.new(1).to_date=>#>>Time.new(1).to_datet

  10. ruby - 使用 Time.zone 使用 strptime 解析时间 - 2

    我正在尝试使用Ruby2.0中的Time类解析日期时间。我不知道如何解析日期并在指定时区获取它。我使用Time.zone.parse解析我第一次调用Time.zone的日期并将其设置为指定时区。在下面的示例中,我设置了区域但它不影响strptime,我已经尝试执行Time.zone.parse(date)但我无法解析它如下所示的日期。Time.zone="CentralTime(US&Canada)"#=>"CentralTime(US&Canada)"irb(main):086:0>Time.strptime("08/26/201303:30PM","%m/%d/%Y%I:%M%p"

随机推荐