]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
markov plugin: do learning in one thread, instead of threading for each message
authorYaohan Chen <yaohan.chen@gmail.com>
Wed, 25 Jun 2008 19:27:38 +0000 (15:27 -0400)
committerYaohan Chen <yaohan.chen@gmail.com>
Wed, 25 Jun 2008 19:27:38 +0000 (15:27 -0400)
data/rbot/plugins/markov.rb

index dcf3b77679dc7e5ad304fa96a74f5efd8ba16d3b..9e0bfccdb488431a018bb79818352abf91814d51 100644 (file)
@@ -32,6 +32,19 @@ class MarkovPlugin < Plugin
       @bot.config['markov.probability'] = @registry['probability']
       @registry.delete('probability')
     end
       @bot.config['markov.probability'] = @registry['probability']
       @registry.delete('probability')
     end
+    @learning_queue = Queue.new
+    @learning_thread = Thread.new do
+      while s = @learning_queue.pop
+        learn s
+      end
+    end
+  end
+
+  def cleanup
+    debug 'closing learning thread'
+    @learning_queue.push nil
+    @learning_thread.join
+    debug 'learning thread closed'
   end
 
   def generate_string(word1, word2)
   end
 
   def generate_string(word1, word2)
@@ -202,20 +215,22 @@ class MarkovPlugin < Plugin
       message = "#{m.sourcenick} #{message}"
     end
     
       message = "#{m.sourcenick} #{message}"
     end
     
+    @learning_queue.push message
+    random_markov(m, message) unless m.replied?
+  end
+
+  def learn(message)
+    # debug "learning #{message}"
     wordlist = message.split(/\s+/)
     return unless wordlist.length >= 2
     wordlist = message.split(/\s+/)
     return unless wordlist.length >= 2
-    Thread.new do
-      word1, word2 = :nonword, :nonword
-      wordlist.each do |word3|
-        k = "#{word1} #{word2}"
-        @registry[k] = @registry[k].push(word3)
-        word1, word2 = word2, word3
-      end
+    word1, word2 = :nonword, :nonword
+    wordlist.each do |word3|
       k = "#{word1} #{word2}"
       k = "#{word1} #{word2}"
-      @registry[k] = @registry[k].push(:nonword)
-
-      random_markov(m, message) unless m.replied?
+      @registry[k] = @registry[k].push(word3)
+      word1, word2 = word2, word3
     end
     end
+    k = "#{word1} #{word2}"
+    @registry[k] = @registry[k].push(:nonword)
   end
 end
 
   end
 end