mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-task: add comprehensive examples demonstrating task features
added six new examples: - simple.rb: basic task creation and execution - priority.rb: priority-based scheduling - suspend_resume.rb: manual task control - inspection.rb: task status and inspection methods - statistics.rb: scheduler monitoring with Task.stat - producer_consumer.rb: task coordination pattern Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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}"
|
||||
@@ -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 ==="
|
||||
@@ -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}"
|
||||
@@ -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!"
|
||||
@@ -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 ==="
|
||||
@@ -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} ==="
|
||||
Reference in New Issue
Block a user