... 随便写了点东西,主要集中在 hello world... 意犹未尽是因为展开就是各种大坑啊...
#3 楼 @goinaction aio 和 epoll 不是一回事,aio 是通过 callback 的方式做 read / write, 要用新开线程的,好处是对应函数在 posix 标准里。epoll 和 kqueue 是不开新线程,就没有 aio 复制栈/同步/切换 CPU 的开销。
我们知道 unix 的一大特色就是什么都是文件,文件描述符 (fd) 可以用一个整数来表示打开的文件,socket, 管道等等东西。进程中的文件描述符 fork 以后还能用,例如 working with unix process 里有用 ruby 启动 python 进程然后在 python 中用 ruby 打开的 fd 的例子。
block 的意思是在等待 read / write / accept 这些 io 操作的时候,进程是 sleep 的。如果用 nonblock 的文件描述符:fcntl(sock, F_SETFL, O_NONBLOCK)
, 你就可以:A. 写个无限循环去不断的问"是不是好了", 这样就会把 CPU 吃到 100% 还不如用 block 操作,B. 做别的事情,但可以做什么就需要一个调度机制,现在可以选择的有线程调度或者事件队列调度,线程调度就是 aio, 事件队列调度就是 epoll / kqueue.
附带说一下 ruby 的 io 的神奇的地方:ruby 的 io 正常来说是阻塞整个进程的,但一开新线程,它就自动变成非阻塞了...
#4 楼 @krazy 没用过,看它的实现应该是 libev 的包装?现在的事件框架太多了吧 libev, libevent, gevent, libuv ...
#40 楼 @bhuztez 进程开太多也可能导致请求被扔掉的... 好多个在 accept 状态的进程被同时唤醒就会产生 thundering herd 效应,然后服务器一卡队列就又堆起来了... 另外每个进程都有数据库连接,拼命开直接就把数据库打爆了...
pkcs1padding 应该是默认不用设置的,是公是母和 ecb 之类的 block chaining 一般写在 key file 里面了不用自己指定一遍吧?
key = OpenSSL::PKey::RSA.read File.open 'xxx.key'
data = [hex_data].pack 'H*'
key.public_encrypt data
ruby + arduino + 乐高... http://rubysource.com/ruby-arduino-lego-rubot/
当然单片机上的 AI 和 PC 不能比...
rainbows 应该是用了 kgio 的 TCPServer, kgio 的继承了标准库的 TCPServer, 标准库的 TCPServer 调用了系统函数 listen
, 然后 listen
有个 backlog 参数,就是系统维护的请求队列的大小,这个队列如果满了,其他请求就会扔掉,标准库用了个默认的 backlog 是 Socket::SOMAXCONN
往往比较小 (我的机器上是 128).
TCPServer 的连接数限制可以用 TCPServer#listen(new_max_conn)
解决掉,但好像 rainbows / unicorn 本身也有一个最大连接数的限制不知道怎么改...
__END__
简单易用的 ruby 语法参考: http://ruby.on-page.net/
写过 awk 或者 perl 就明白了。
主要在 ruby -n
时有用
ruby -ne 'BEGIN{ i = 0 }; i += 1; END{ puts i }' < file_you_need_count_lines
没办法吧,名词没有对应的翻译必须混搭,放代码必须混搭...
最明显可以看出区别的就是 '&'.to_json
和 '&'.inspect
, "&" 在 json 里是要转义的但在 ruby 不用
同 #6 楼
File.open('test', 'w') do |f|
f.write(str.inspect[1...-1])
end
gem 可以覆盖 stdlib 有什么可痛的,如果不带 stdlib 在一些不能装 gem 的地方就不好使了