【发布时间】:2022-01-05 09:11:34
【问题描述】:
我目前正在学习 Ruby on Rails,为此我正在开发一个网页游戏。
这款游戏与 Travian 属于同一类型,玩家可以建造建筑物等...
我解释说,我在实现我的“构建队列”时有点卡在这个功能上。
一个玩家最多排在 3 个建筑物的队列中。 第一个完成后,我们首先检查他是否有必要的资源进行下一个,依此类推。
目前,我使用 BuildQueue 表管理我的队列。只要之前的构建还没有完成,我们就等待。构建启动后,它会启动一个在构建期间休眠的线程:
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
所以这是一个基本的系统,但它可以工作。
我想改进它,但我找不到办法。
我发现 Rails 作业与 ActiveJob 一起使用,但我不知道是否可以:
- 将作业链接到用户并且每个启动的作业都等到前一个作业完成?
- 如果作业 2 无法启动,请立即尝试启动作业 3
我还看到了使用 Redis 并将我的工作按应该完成的顺序排列的可能性。但是在这里我有同样的问题
- 如果因为玩家没有资源而无法启动任务2,您必须立即尝试启动任务3
否则,作为最后的手段,我想到了一个 cron 系统,但我认为它比我现在做的更糟糕
问候
【问题讨论】:
标签: ruby-on-rails ruby jobs delayed-job job-scheduling