diff --git a/mrbgems/mruby-task/examples/inspection.rb b/mrbgems/mruby-task/examples/inspection.rb new file mode 100644 index 000000000..08068f535 --- /dev/null +++ b/mrbgems/mruby-task/examples/inspection.rb @@ -0,0 +1,65 @@ +# Task Inspection Example +# Demonstrates task status and inspect methods + +puts "=== Task Inspection Demo ===" +puts + +# Create some tasks +worker1 = Task.new(name: "worker-1") do + puts "Worker 1: Starting" + puts "Worker 1: My status is #{Task.current.status}" + puts "Worker 1: My inspect is #{Task.current.inspect}" + sleep 0.5 + puts "Worker 1: Finished" +end + +worker2 = Task.new(name: "worker-2") do + sleep 1 + puts "Worker 2: Finished" +end + +# Inspect before running +puts "Initial task states:" +puts " worker1: #{worker1.inspect}" +puts " status=#{worker1.status}" +puts " worker2: #{worker2.inspect}" +puts " status=#{worker2.status}" +puts + +# Create an observer task +observer = Task.new(name: "observer") do + sleep 0.2 + + puts "\nObserver checking task states:" + puts " worker1: #{worker1.inspect}" + puts " status=#{worker1.status}" + puts " worker2: #{worker2.inspect}" + puts " status=#{worker2.status}" + + sleep 0.5 + + # Suspend worker2 + worker2.suspend + puts "\nObserver suspended worker2:" + puts " worker2: #{worker2.inspect}" + puts " status=#{worker2.status}" + + sleep 0.3 + + # Resume and terminate + worker2.resume + sleep 0.1 + worker2.terminate + + puts "\nObserver terminated worker2:" + puts " worker2: #{worker2.inspect}" + puts " status=#{worker2.status}" +end + +# Run the scheduler +Task.run + +puts "\n=== Final states ===" +puts " worker1: #{worker1.inspect} status=#{worker1.status}" +puts " worker2: #{worker2.inspect} status=#{worker2.status}" +puts " observer: #{observer.inspect} status=#{observer.status}" diff --git a/mrbgems/mruby-task/examples/priority.rb b/mrbgems/mruby-task/examples/priority.rb new file mode 100644 index 000000000..ee3ec97ed --- /dev/null +++ b/mrbgems/mruby-task/examples/priority.rb @@ -0,0 +1,41 @@ +# Priority Scheduling Example +# Lower priority values = higher priority (0 is highest) + +puts "=== Priority Scheduling Demo ===" +puts + +# Create tasks with different priorities +low_priority = Task.new(name: "low-priority", priority: 200) do + 5.times do |i| + puts " [Low Priority] iteration #{i}" + sleep 0.1 + end +end + +high_priority = Task.new(name: "high-priority", priority: 50) do + 5.times do |i| + puts "[High Priority] iteration #{i}" + sleep 0.1 + end +end + +medium_priority = Task.new(name: "medium-priority", priority: 128) do + 5.times do |i| + puts " [Medium Priority] iteration #{i}" + sleep 0.1 + end +end + +puts "Created 3 tasks with different priorities:" +puts " High: priority=50" +puts " Medium: priority=128" +puts " Low: priority=200" +puts +puts "Tasks will run in priority order (highest first)" +puts + +# Run the scheduler +Task.run + +puts +puts "=== All tasks completed ===" diff --git a/mrbgems/mruby-task/examples/producer_consumer.rb b/mrbgems/mruby-task/examples/producer_consumer.rb new file mode 100644 index 000000000..4a1427f8b --- /dev/null +++ b/mrbgems/mruby-task/examples/producer_consumer.rb @@ -0,0 +1,58 @@ +# Producer/Consumer Example +# Demonstrates task coordination using shared state + +puts "=== Producer/Consumer Demo ===" +puts + +# Shared buffer +$buffer = [] +$max_items = 10 +$produced = 0 + +# Producer task +producer = Task.new(name: "producer") do + $max_items.times do |i| + # Produce an item + item = "item-#{i}" + $buffer << item + $produced += 1 + puts "Producer: created #{item} (buffer size: #{$buffer.size})" + + sleep 0.3 + end + puts "Producer: finished producing #{$max_items} items" +end + +# Consumer task +consumer = Task.new(name: "consumer") do + consumed = 0 + + while consumed < $max_items + if $buffer.empty? + puts "Consumer: buffer empty, waiting..." + sleep 0.2 + else + item = $buffer.shift + consumed += 1 + puts "Consumer: consumed #{item} (#{consumed}/#{$max_items})" + sleep 0.5 + end + end + + puts "Consumer: finished consuming #{consumed} items" +end + +# Monitor task +monitor = Task.new(name: "monitor") do + loop do + sleep 1 + puts "Monitor: produced=#{$produced}, buffer=#{$buffer.size}, remaining=#{$max_items - $produced}" + break if $produced >= $max_items && $buffer.empty? + end +end + +# Run the scheduler +Task.run + +puts "\n=== All tasks completed ===" +puts "Final state: produced=#{$produced}, buffer=#{$buffer.size}" diff --git a/mrbgems/mruby-task/examples/simple.rb b/mrbgems/mruby-task/examples/simple.rb new file mode 100644 index 000000000..52a8de571 --- /dev/null +++ b/mrbgems/mruby-task/examples/simple.rb @@ -0,0 +1,27 @@ +# Simple Task Example +# Basic usage of mruby-task + +puts "=== Simple Task Demo ===" +puts + +# Create a simple task +Task.new(name: "hello") do + 3.times do |i| + puts "Hello from task, iteration #{i}" + sleep 0.5 + end +end + +# Create another task +Task.new(name: "world") do + 3.times do |i| + puts "World from task, iteration #{i}" + sleep 0.7 + end +end + +# Run the scheduler - blocks until all tasks complete +puts "Starting tasks..." +Task.run + +puts "All tasks completed!" diff --git a/mrbgems/mruby-task/examples/statistics.rb b/mrbgems/mruby-task/examples/statistics.rb new file mode 100644 index 000000000..3fd4fa98a --- /dev/null +++ b/mrbgems/mruby-task/examples/statistics.rb @@ -0,0 +1,59 @@ +# Task Statistics Example +# Demonstrates Task.stat for monitoring scheduler state + +def print_stats(label) + stat = Task.stat + puts "\n#{label}" + puts " Tick: #{stat[:tick]}, Next wakeup: #{stat[:wakeup_tick]}" + puts " Ready: #{stat[:ready][:count]} tasks" + puts " Waiting: #{stat[:waiting][:count]} tasks" + puts " Suspended: #{stat[:suspended][:count]} tasks" + puts " Dormant: #{stat[:dormant][:count]} tasks" +end + +puts "=== Task Statistics Demo ===" + +print_stats("Initial state:") + +# Create several tasks +workers = [] +5.times do |i| + workers << Task.new(name: "worker-#{i}") do + sleep 0.5 + puts "Worker #{i} completed" + end +end + +print_stats("After creating 5 tasks:") + +# Create a monitor task +monitor = Task.new(name: "monitor") do + sleep 0.1 + print_stats("Monitor: After 0.1s:") + + # Suspend a couple tasks + workers[2].suspend + workers[3].suspend + + print_stats("Monitor: After suspending 2 tasks:") + + sleep 0.5 + + print_stats("Monitor: After 0.5s more:") + + # Resume suspended tasks + workers[2].resume + workers[3].resume + + print_stats("Monitor: After resuming tasks:") + + # Wait for all workers + workers.each(&:join) +end + +# Run the scheduler +Task.run + +print_stats("Final state:") + +puts "\n=== Demo complete ===" diff --git a/mrbgems/mruby-task/examples/suspend_resume.rb b/mrbgems/mruby-task/examples/suspend_resume.rb new file mode 100644 index 000000000..c90832ecc --- /dev/null +++ b/mrbgems/mruby-task/examples/suspend_resume.rb @@ -0,0 +1,47 @@ +# Suspend and Resume Example +# Demonstrates manual task control + +puts "=== Suspend/Resume Demo ===" +puts + +$counter = 0 + +# Create a worker task +worker = Task.new(name: "worker") do + 10.times do |i| + puts "Worker: iteration #{i}, counter=#{$counter}" + $counter += 1 + sleep 0.2 + end + puts "Worker: finished!" +end + +# Create a controller task +controller = Task.new(name: "controller") do + sleep 0.5 + + puts "\nController: Suspending worker..." + worker.suspend + puts "Controller: Worker status = #{worker.status}" + + sleep 1 + + puts "\nController: Incrementing counter while worker is suspended..." + 5.times do + $counter += 10 + puts "Controller: counter=#{$counter}" + sleep 0.2 + end + + puts "\nController: Resuming worker..." + worker.resume + puts "Controller: Worker status = #{worker.status}" + + # Wait for worker to finish + worker.join +end + +# Run the scheduler +Task.run + +puts "\n=== Final counter value: #{$counter} ==="