首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用与用户关联的rails创建“构建队列”

使用与用户关联的rails创建“构建队列”
EN

Stack Overflow用户
提问于 2022-01-05 09:11:34
回答 1查看 62关注 0票数 0

我目前正在学习Rails,为此我正在开发一个网络游戏。

这个游戏的风格和特拉维安一样,玩家可以建造建筑物等等。

我解释说,为了实现我的“构建队列”,我有点困在这个特性上了。

一名球员最多在3栋楼排队。当第一个完成后,我们首先检查他是否有必要的资源去下一个,以此类推。

目前,我使用BuildQueue表管理队列。只要前面的构建还没有完成,我们就会等待。一旦构建启动,它将启动一个线程,该线程在构建过程中处于休眠状态:

代码语言:javascript
复制
build_in_progress = BuildQueue.where(queue_type: 'build', kingdom_id: current_kingdom.id)

# It means that the building queue is empty
if build_in_progress.empty?

  build_time = time(building)
  new_queue = BuildQueue.create(queue_type: 'build', build: building, kingdom_id: current_kingdom.id, build_time: build_time)

  Thread.start do
    sleep build_time

    # [...] Here I update the building concerned
    new_queue.destroy
  end
else
  build_in_progress_id = build_in_progress.last.id
  new_queue = BuildQueue.create(queue_type: 'build', build: building, kingdom_id: current_kingdom.id)

  Thread.start do
    build_in_progress = BuildQueue.find_by_id(build_in_progress_id)
    until build_in_progress.nil?
      sleep 1
      build_in_progress = BuildQueue.find_by_id(build_in_progress_id)
    end

    # We check that the player still has the necessary resources
    cost = cost(building)

    if can_upgrade?(cost)
      build_time = time(building)
      new_queue.build_time = build_time
      new_queue.save

      sleep build_time

      # [...] Here I update the building concerned
      Notification.create(kingdom_id: current_kingdom.id, notif_type: 'build', message: "The construction of #{t("buildings.#{building}")} is finished", icon: 'gavel')
    end

    new_queue.destroy
  end
end

所以这是一个基本的系统,但它起作用了。

我想改进它,但我很难找到一个方法来做到这一点。

我在ActiveJob中发现了Rails作业的用法,但我不知道是否可以:

  • 将作业链接到用户,并且每个启动的作业都等待到上一个作业完成?
  • 如果作业2无法启动,请立即尝试启动作业3。

我也看到了使用Redis的可能性,并将我的工作按应该完成的顺序排列。但在这里我也有同样的问题

  • 如果由于播放器没有资源而无法启动作业2,则必须立即尝试启动作业3。

否则,作为最后的手段,我想到了一个cron系统,但我认为它比我现在所做的还要糟糕

问候

EN

回答 1

Stack Overflow用户

发布于 2022-01-05 11:45:25

考虑使用宝石智慧。它还有用于异步事件处理的各种适配器。

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

https://stackoverflow.com/questions/70590300

复制
相关文章

相似问题

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