2016-05-30 4 views
-1

Я в ситуации, когда у меня есть основной запрос, но я жду завершения других запросов, которые были отправлены в фоновом режиме. Я пытаюсь следующийКак скрыть основной поток, ожидая завершения какого-либо фонового процесса?

myclass.rb

# class variables 
@@semaphore = Mutex.new 
# class methods ... 
def entry ... 
def main_request ... 
def background_request ... 

/запись

$unavailable = true 
# starts /main_request and /background_request 

/main_request

@@semaphore.synchronize{ 
    while($unavailable) 
     sleep(1) 
    end 
} 
# use information updated by background_request 

/background_request

@@semaphore.synchronize{ 
    $unavailable = false 
} 

Мне, возможно, придется больше познакомиться с темами/Мьютексами в рубине или просто параллелизмом вообще, так как я уже делаю много предположений.

Результатом этого является то, что main_request не заполняется. Я пробовал это без семафора, и основной запрос просто отмирает. (NGINX 499) Итак, как мне сделать сбой основного потока, ожидая завершения какого-либо фонового процесса?

Возможно, я собираюсь все это неправильно. Какие-либо предложения? Могу ли я каким-то образом присоединиться к другим запросам/потокам?

+0

Какая проблема вы пытаетесь решить? –

+0

Обновлено название и добавлен ключевой вопрос. – ebichuhamster

+0

Я не уверен, что вы пытаетесь сделать здесь, но вы знали, что Thread имеет метод экземпляра под названием 'join', правильно? 'foo_thread.join' заставляет основной поток ждать, пока' foo_thread' завершит свою работу и вернет управление основному потоку. Это говорит о том, что вы, возможно, захотите более подробно рассказать о том, чего именно вы пытаетесь достичь, потому что может быть лучший способ сделать это, не возившись с параллелизмом. – MarsAtomic

ответ

0

Вы ищете метод join. http://ruby-doc.org/core-2.2.0/Thread.html#method-i-join

Просто сохраните указатель на резьбе при их создании в переменную (например. x = Thread.new), и когда вы будете готовы ждать их, чтобы закончить, прежде чем продолжить выполнения запустить x.join.

+0

Проблема, которую я вижу в этом, заключается в том, что я не вижу, где я могу использовать «Thread.new». У меня есть три конечных точки REST, которые вызываются в некотором неизвестном порядке извне приложения, и я ищу обновление состояния приложения, когда одна из этих конечных точек завершает его выполнение. На данный момент я просто попытаюсь сохранить в БД. – ebichuhamster

Смежные вопросы