Ruby API支持¶
状态¶
用于Ruby的uWSGI API仍然未完成 (QueueFramework, SharedArea, 自定义路由和SNMP是最缺乏的一员)。一旦各种API调用准备好了,将会立即扩展DSL。
当前可用的API函数和常量 (可用在UWSGI ruby模块中找到) 是
- UWSGI.suspend
- UWSGI.masterpid
- UWSGI.async_sleep
- UWSGI.wait_fd_read
- UWSGI.wait_fd_write
- UWSGI.async_connect
- UWSGI.signal
- UWSGI.register_signal
- UWSGI.register_rpc
- UWSGI.signal_registered
- UWSGI.signal_wait
- UWSGI.signal_received
- UWSGI.add_cron
- UWSGI.add_timer
- UWSGI.add_rb_timer
- UWSGI.add_file_monitor
- UWSGI.cache_get
- UWSGI.cache_get!
- UWSGI.cache_exists
- UWSGI.cache_exists?
- UWSGI.cache_del
- UWSGI.cache_set
- UWSGI.cache_set
- UWSGI.cache_set!
- UWSGI.cache_update
- UWSGI.cache_update!
- UWSGI.setprocname
- UWSGI.set_warning_message
- UWSGI.lock
- UWSGI.unlock
- UWSGI.mem
- UWSGI.mule_get_msg
- UWSGI.request_id
- UWSGI.mule_id
- UWSGI.mule_msg
- UWSGI.worker_id
- UWSGI.log
- UWSGI.logsize
- UWSGI.i_am_the_spooler
- UWSGI.send_to_spooler
- UWSGI.spool
- UWSGI::OPT
- UWSGI::VERSION
- UWSGI::HOSTNAME
- UWSGI::NUMPROC
- UWSGI::PIDFILE
- UWSGI::SPOOL_OK
- UWSGI::SPOOL_RETRY
- UWSGI::SPOLL_IGNORE
uWSGI DSL¶
平行于uWSGI API Python装饰器,有一个可用的用于Ruby的DSL,允许优雅访问 uWSGI API。
这个模块作为 uwsgidsl.rb
,可以在源代码发行版中找到。你可以将这个代码放到你的 config.ru
文件中,或者使用 rbrequire
选项来自动包含它。
cron(hours, mins, dom, mon, dow, block)¶
使用 CronInterface
周期性执行一个任务
cron 20,16,-1,-1,-1 do |signum|
puts "It's time for tea."
end
signal(signum, block)¶
为 SignalFramework
将代码注册为信号处理器。
signal 17 do |signum|
puts "Signal #{signum} was invoked."
end
rpc(name, block)¶
将代码作为 uWSGI RPC栈 函数注册。
rpc 'helloworld' do
return "Hello World"
end
rpc 'advancedhelloworld' do |x,y|
return "x = #{x}, y = #{y}"
end
mule(id?, block)¶
将代码作为 Mule brain注册。
mule 1 do # Run in mule 1
puts "I am the mule #{UWSGI.mule_id}"
end
mule do # Run in first available mule
puts "I am the mule #{UWSGI.mule_id}"
end
在函数返回之后,mule将会是无brain的。要避免这个问题,请将这个代码放到一个循环中,或者使用 muleloop
。
muleloop(id?, block)¶
在一个循环上下文中,在Mule中执行代码。
muleloop 3 do
puts "I am the mule #{UWSGI.mule_id}"
sleep(2)
end
SpoolProc¶
Proc
的子类,允许你定义一个在 Spooler 中执行的任务。
# define the function
my_long_running_task = SpoolProc.new {|args|
puts "I am a task"
UWSGI::SPOOL_OK
}
# spool it
my_long_running_task.call({'foo' => 'bar', 'one' => 'two'})
MuleFunc¶
从任意进程(例如一个worker)中调用一个函数,但是在mule中执行
i_am_a_long_running_function = MuleFunc.new do |pippo, pluto|
puts "i am mule #{UWSGI.mule_id} #{pippo}, #{pluto}"
end
i_am_a_long_running_function.call("serena", "alessandro")
这个worker调用 i_am_a_long_running_function()
,但是函数将会在第一个可用mule中异步执行。
如果你想在一个指定的mule中运行函数,那么添加一个ID参数。以下代码将会只使用mule #5。
i_am_a_long_running_function = MuleFunc.new 5 do |pippo,pluto|
puts "i am mule #{UWSGI.mule_id} #{pippo}, #{pluto}"
end
i_am_a_long_running_function.call("serena", "alessandro")
真实世界的使用¶
一个简单的Sinatra应用,每30秒打印消息:
# This is config.ru
require 'rubygems'
require 'sinatra'
require 'uwsgidsl'
timer 30 do |signum|
puts "30 seconds elapsed"
end
get '/hi' do
"Hello World!"
end
run Sinatra::Application
或者你可以将你的代码放到一个专有的文件中 (这里是 mytasks.rb
)
require 'uwsgidsl'
timer 30 do |signum|
puts "30 seconds elapsed"
end
timer 60 do |signum|
puts "60 seconds elapsed"
end
然后这样加载它
uwsgi --socket :3031 --rack config.ru --rbrequire mytasks.rb --master --processes 4