我目前正在学习Rails,为此我正在开发一个网络游戏。
这个游戏的风格和特拉维安一样,玩家可以建造建筑物等等。
我解释说,为了实现我的“构建队列”,我有点困在这个特性上了。
一名球员最多在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所以这是一个基本的系统,但它起作用了。
我想改进它,但我很难找到一个方法来做到这一点。
我在ActiveJob中发现了Rails作业的用法,但我不知道是否可以:
我也看到了使用Redis的可能性,并将我的工作按应该完成的顺序排列。但在这里我也有同样的问题
否则,作为最后的手段,我想到了一个cron系统,但我认为它比我现在所做的还要糟糕
问候
发布于 2022-01-05 11:45:25
考虑使用宝石智慧。它还有用于异步事件处理的各种适配器。
https://stackoverflow.com/questions/70590300
复制相似问题