Как вызвать методы объекта, когда объект находится в потоке? Рубин (не рельсы) - PullRequest
0 голосов
/ 26 апреля 2019

Если я помещаю объект в поток, как мне вызывать методы для этого объекта. Пример того, что я хочу сделать ниже и моя текущая ошибка.

неопределенный метод `_method_name 'для [" var ", #Thread: 0x00007f9b181edec0@b.rb: 183

threads = {}

freq.each do |var|
  threads[var] = Thread.new {object.new.method}
end

while true
  threads.each do |thr|
    thr.method_inside_the_object
  end
end

1 Ответ

2 голосов
/ 26 апреля 2019

Когда вы пишете это:

Thread.new { ... }

{ ... } - это блок , который будет выполняться новым потоком. Если вы хотите, чтобы поток сделал что-то интересное, тогда вы должны предоставить код (...), чтобы сделать интересную вещь.


Как правило, оригинальный поток продолжает делать что-то еще одновременно с новым потоком:

Thread.new { ... }
do_something_else()

Параллельное выполнение операций (возможно, даже параллельно ) - это, в конце концов, смысл многопоточности.


Потоки взаимодействуют посредством доступа к общим объектам ... но одному потоку не имеет смысла смотреть на общий объект, пока он не узнает, что другой поток завершил его обновление. Самый простой способ - join() другой поток.

t = Thread.new { ... }
do_something_else()
t.join()   # this simply waits until the thread has finished.

Теперь об этих общих объектах. Это особенно легко в Ruby.

shared_object = Hash.new()
t = Thread.new {
    shared_object["a"] = ...
    shared_object["b"] = ...
    ...
}
do_something_else()
t.join()
# after the join() call returns, it's safe to look in shared_object
# to see what the other thread left for us.
do_something_with(shared_object["a"])
...

Существует еще одна проблема, которая возникает, если вам нужен основной поток для доступа к shared_object одновременно с новым потоком (то есть, за до он вызывает t.join()). Google для «условия гонки», или «блокировки», или «взаимного исключения», или « mutex » для получения дополнительной информации о том, почему это сложно, и как сделать это безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...