рубиновое программирование потока, рубиновый эквивалент java wait/notify/notifyAll

Не очень, но вот возможное решение:

# seperator is multi-space, but not possible in R
file_data <- "1.1.1.1     Alcohol dehydrogenase.
1.1.1.2     Alcohol dehydrogenase (NADP(+)).
1.1.1.3     Homoserine dehydrogenase.
1.1.1.4     (R,R)-butanediol dehydrogenase.
1.1.1.5     Transferred entry: 1.1.1.303 and 1.1.1.304.
1.1.1.6     Glycerol dehydrogenase.
1.1.1.7     Propanediol-phosphate dehydrogenase.
1.1.1.8     Glycerol-3-phosphate dehydrogenase (NAD(+)).
1.1.1.9     D-xylulose reductase.
1.1.1.10    L-xylulose reductase."

# change sep from 4 spaces to \t, which is identifiable. 
# replace textConnection(file_data) with your data file name
read_text <- readLines(textConnection(file_data ))
altered_text <- gsub("    ", "\t", read_text)

# parsing from altered text
df <- read.delim(textConnection(altered_text), header=FALSE, sep="\t", fill=TRUE)
df

Проблема в том, что ваш разделитель содержит более одного символа ( http://r.789695.n4.nabble.com/ множественные-сепараторы-в-SEP-аргумент-для-чтения-таблицы-td856567.html ).

В качестве альтернативы можно было бы изменить предварительную загрузку даты, чтобы иметь общий разделитель между столбцами. В противном случае считайте данные, как вы уже сделали, и добавьте шаг данных, чтобы объединить столбцы от 2 до 1 столбца, например. используя paste.

6
задан Geo 11 February 2009 в 00:22
поделиться

5 ответов

С протестом, что я не знаю Java, на основе Ваших комментариев, я думаю, что Вы хотите условную переменную. Google для "условной переменной Ruby" придумывает набор полезных страниц. Первая ссылка, которую я получаю, кажется, хорошее краткое введение для создания условий Вара, в частности, в то время как это похоже на него, дает намного более широкое покрытие потокового программирования в Ruby.

2
ответ дан 9 December 2019 в 22:40
поделиться

Нет никакого эквивалента notifyAll (), но другие два Thread.stop (останавливает текущий поток), и run (обращенный остановленный поток, чтобы заставить его начать идти снова).

1
ответ дан 9 December 2019 в 22:40
поделиться

Я думаю, что Вы хотите, Thread#join

threads = []
10.times do
  threads << Thread.new do
    some_method(:foo)
  end
end

threads.each { |thread| thread.join } #or threads.each(&:join)

puts 'Done with all threads'
0
ответ дан 9 December 2019 в 22:40
поделиться

Думаю, вам нужно что-то вроде этого. Это будет работать с любым объектом, инстанцированным после выполнения этой команды. Это не идеально, особенно там, где Thread.stop находится вне мьютекса. В java ожидание потока освобождает монитор.

class Object 
  def wait
    @waiting_threads = [] unless @waiting_threads
    @monitor_mutex = Mutex.new unless @monitor_mutex
    @monitor_mutex.synchronize {
      @waiting_threads << Thread.current
    }
    Thread.stop
  end

  def notify
    if @monitor_mutex and @waiting_threads 
      @monitor_mutex.synchronize {
        @waiting_threads.delete_at(0).run unless @waiting_threads.empty?
      }
    end
  end

  def notify_all
    if @monitor_mutex and @waiting_threads
      @monitor_mutex.synchronize {
        @waiting_threads.each {|thread| thread.run}
        @waiting_threads = []
      }
    end
  end
end
1
ответ дан 9 December 2019 в 22:40
поделиться

То, что вы ищете, это ConditionVariable в Thread :

require "thread"

m = Mutex.new 
c = ConditionVariable.new
t = []

t << Thread.new do
  m.synchronize do
    puts "A - I am in critical region"
    c.wait(m)
    puts "A - Back in critical region"
  end
end

t << Thread.new do
  m.synchronize do
    puts "B - I am critical region now"
    c.signal
    puts "B - I am done with critical region"
  end
end

t.each {|th| th.join }
7
ответ дан 9 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: