首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4赛车/并发。避免死锁

Rails 4赛车/并发。避免死锁
EN

Stack Overflow用户
提问于 2015-10-13 17:23:12
回答 2查看 1.1K关注 0票数 0

我目前在Sidekiq的帮助下使用Sidekiq--独一无二的--乔布斯和Sidekiq-状态来执行我的应用程序上的任务。

工人所做的工作很小,而且几乎总是立即执行。(很少或根本没有排队)

我正在“黑客”侧奇克来同步执行任务(检查控制器找不到由工作人员创建的对象),这些任务很小,执行速度也很快(通常不到1秒)。我的应用程序需要同步运行作业并获取其详细信息(创建/更新记录)。

我用的是“蹩脚”的解决方案:

代码语言:javascript
复制
  20.times do
    status = Sidekiq::Status::get balance, :exp_status
    if ["done"].include?(status)
      break
    end
    sleep(0.2)
  end

创建一个队列,并通过params确保同一个用户同时执行的作业不超过一个--我可以避免所有死锁,但是我觉得这应该是一个更好的执行方法,而不是黑客,因为它是用来异步执行作业的。

的问题是:在限制输入的方式上,有没有任何替代或类似的创业板可以限制输入,但在默认情况下是要同步运行的?我不能仅仅询问控制器Balance.find_or_create_by(user: user, market: market),因为它迟早会给我带来死锁(同时编辑/manipulated /创建记录),但我觉得从长远来看,我使用的侧翼解决方案也是不可能的。我是不是错过了一些基本的东西??如何确保通过中间件或类似的重复params/操作不同时执行以避免死锁?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-15 01:37:17

我用朱迪斯-穆特解决了我的问题。

有了这一点,我就有了一个本机同步解决方案,它仍然可以锁定我正在处理的行,如果行被锁定,也没有问题,因为我只是简单地重试。当记录解锁时,它会返回并重新尝试这项工作。

代码语言:javascript
复制
  def enter
    RedisMutex.with_lock(user) do
      # hard-work
    end
  rescue RedisMutex::LockError
    retry
  end
票数 2
EN

Stack Overflow用户

发布于 2015-10-13 18:00:57

你在黑一个可怜人的分布式互斥物。有更好的方法。

自由和开放源码软件

Sidekiq企业的官方API

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33108855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档