Чтобы избежать таких условий гонки в многопоточном коде, главное, чтобы вы искали побочные эффекты .
Думайте о блоке bot.message(contains:"$Wset") do |event|
как о мини программа или нить . Все здесь должно быть самодостаточным - для него не должно быть никакого способа воздействовать на другие потоки.
Изначально просматривая ваш код, я ищу любые 1014 * общие переменные . Они создают состояние гонки, если они читаются / записываются несколькими потоками одновременно.
В этом случае есть два очевидных нарушителя - @player
и @user
. Они должны быть реорганизованы в локальные переменные , а не переменные экземпляра . Определите их в блоке, чтобы они не влияли на другие области видимости, например:
# Note, for this to work, you will have to change
# the method definition to return [player, user]
player, user = check_user_or_nick(event)
Иногда создание побочных эффектов от потоков неизбежно (например, вы хотите создать счетчик для того, сколько раз поток был запущен). Чтобы предотвратить условия гонки в этих сценариях ios, Mutex
обычно является решением, но также иногда распределенная блокировка , если код запускается на нескольких машинах . Однако, из кода, который вы показали, не похоже, что вам нужно что-то из этого здесь.