As of Ruby 1.9, Ruby uses native threads. Native threads means that each thread created by Ruby is directly mapped to a thread generated at the Operating System level. Every modern programming language implements native threads, so it makes more sense to use native threads. Here are some pros of native threads:
Pros
- Run on multiple processors
- Scheduled by the OS
- Blocking I/O operations don’t block other threads.
Even though have native threads in Ruby 1.9, only one thread will be executing at any given time, even if we have multiple cores in our processor. This is because of the GIL (Global Interpreter Lock) or GVL (Global VM Lock) that MRI Ruby (JRuby and Rubinius do not have a GIL, and, as such, have “real” threads) uses. This prevents other threads from being executed if one thread is already being executed by Ruby. But Ruby is smart enough to switch control to other waiting threads if one thread is waiting for some I/O operation to complete.
如上说的,在 Ruby 1.9 版本以后,I/O 密集型使用多线程是可以的,但是 CPU 密集型的 task,使用多线程就没有用了。 所以我认为,使用多进程来解决 CPU 密集型的任务是更好的方案,Resque 貌似使用的是多进程,而 sidekiq 采用的是多线程。至于是用队列还是直接写,还是怎么样的,根据你的应用的实际情况做相应的策略。
而你上面指出的 redisrb 这个 gem 的源码,redis server 那边因为是单线程模型运行,所以 redis client 是有可能会被阻塞住的。对于你外面的采用多线程,MRI 本身要进行调度,所以在你这种情况下多线程并没有单线程有优势。
Redis is a single-threaded server. It is not designed to benefit from multiple CPU cores. People are supposed to launch several Redis instances to scale out on several cores if needed. It is not really fair to compare one single Redis instance to a multi-threaded data store.
如上面说的,Redis 以单线程模型运行,不需要考虑并发读写的问题。
楼主少发了一个十分重要的信息
Refile is a modern file upload library for Ruby applications. It is simple, yet powerful. Refile is an attempt by CarrierWave's original author to fix the design mistakes and overengineering in CarrierWave.
对于楼主的经历表示赞。
对于“WEB 开发的走势”这部分的观点表示不赞同,因为没有场景的设定、没有数据说明而下的结论,过于片面。 而且一门工具的存在意义在于它究竟能解决什么样的问题,而判断优秀与否在于在解决同样的一个或一类问题上与其他相同的工具的效率与可维护性等等之间的比较。
能否问下楼主毕业参加工作多少年了?
听是听说,但 foxmail 还是照样收得到
#19 楼 @HungYuHei 同意 19 楼的说法
我打杂的
建议在生产环境里使用 unicorn(支持热部署),在开发环境下用 puma 和 thin 都可以
这东西确定配置对了?
ActionMailer::Base.smtp_settings = {
:address => "smtp.163.com",
:port => 25,
:domain => '163.com',
:user_name => 'your_user_name',
:password => 'your_password',
:authentication => "plain"
}
select
date_trunc('minute', timestamp) as timestamp,
hight,
low,
volum,
count(id) as count
from your_table
group by date_trunc('minute', timestamp)
order by timestamp asc
建议再整个大屏幕
首先,你的程序是必须去维护进度这么一个数据的。 当开始处理时,你需要知道总共有多少条数据,还要维护一个当前以处理了多少条,这样就能知道进度了。 而你发起 ajax 来获取进度,那么你就需要有个地方来放这么一个进度的信息。
我建议你把这个信息放到 redis 里面去就好了,自己定义好 key 的规则就可以了。 或者说,你放到其他地方(文件、mysql 等等)都可以,反正就是需要有个地方能让另外一个进程拿到数据就可以了。
开新的标签页的话,就享受不到 turbolinks
的好处了
1、直接进数据库,用 SQL 代码改那个字段的类型; 2、直接改那个 migration 文件,然后跑一下 rake db:migrate
这样,你已有的数据库测试的记录还不会丢
原来的比较好
#5 楼 @shangrenzhidao 还好,周边的同事还能习惯,哈哈
如果是在宿舍自己用,我更喜欢青轴,但在公司就不敢了,买了个茶轴。
已买,但未发货。。
可以把 APP 需要的初始数据,写在 db/seeds.rb
文件里,然后跑 rake db:seed
加载到数据库里面去。
例如:
country_list = [
[ "Germany", 81831000 ],
[ "France", 65447374 ],
[ "Belgium", 10839905 ],
[ "Netherlands", 16680000 ]
]
country_list.each do |name, population|
Country.create( name: name, population: population )
end
#2 楼 @glz1992 http://guides.rubyonrails.org/index.html 搜索一下 cache
ActveRecord + Elasticsearch
#29 楼 @bobby_chen 建议你去弄清楚为什么慢!这点非常重要,找到了,才好对症下药。
之所以慢,都是因为这个操作其计算量大的原因。只需要将计算量降下来,或者提前一次性做好这件事情就可以了。
我给你的建议是,新建一张表,然后你对每一个 game_id 每天生成一条 count(*) 记录,然后存起来就可以了。
你试试
然后