当 A 线程还在执行代码时(但是已经超过超时时间),B 线程发现锁已经超过超时时间,然后 B 设置了新的超时时间并获取了锁(仅仅在 A 线程执行完毕后在 log 中记录一条 warning),这种做法是否合理?感觉上即使一个线程的执行时间如果超过了超时时间,其他线程也不应该获取到这个锁,而是获取锁失败。
A 线程要负责释放锁,否则如果 A 异常退出那么就是死锁了。如果 A 在锁过期时间内执行不完,A 可以 extend 锁。
但是在 Discourse 中的使用方式都是下面这样,所以有点迷惑,这种方式使用的话是不是就不需要 Mutex.new.synchronize 来保证原子性了:
DistributedMutex.synchronize
借助 redis 实现了跨进程/机器的锁,Mutex#synchronize
实现了本进程起的线程级别的锁。的确可以只用 redis 实现线程级别的锁,但是毕竟有额外的 redis 读写操作,不如直接用内置的Mutex#synchronize
。
附:Rails 中,关于多线程方面的知识可以在哪里接触到?是一个或 n 个请求就会对应一个线程,又或者是一个 session 会对应一个线程?
Rails 用的多线程知识可能并不多,顶多是如何在多线程环境下初始化一个单例。多线程可以看 puma 或者 sidekiq。
看看你 rails 版本
verbose_query_logs
在https://github.com/rails/rails/blob/41bbd7cd0e4e950ea5a366f78b26b32ed6bd0644/activerecord/lib/active_record/core.rb#L26 定义的
class Form < ActiveRecord::Base
self.abstract_class = true
def self.inherited klass
klass.class_eval do
default_scope order("#{table_name}.form_date DESC")
end
end
end
class SubForm < Form
end
用body= sock.read
就好了,一般都用read
或者read_nonblock
,没见过用recv
这个场景比较适合 Elixir, 除了并发上的优势,还有 OTP 用来支持“OT 转换算法”。
Ruby 技巧太多,学 Ruby 的总有一个阶段忍不住要用各种技巧。 经验多了反而能克制住自己,尽量少用技巧,写方便阅读的代码,面向维护者编程。
你先证明 Ruby 是单线程
早期 Ruby 线程是很弱语言级别的线程 (绿色线程),但是很早之前已经换成系统线程了。
Rails 文档算非常好的了,Ruby 的源码我至今也没看过也不影响开发。
web 开发,尤其是全栈开发本身知识点比较杂才是劝退新手的主要原因。python 还能干别的,ruby 不做 web 没得做
https://ruby-doc.com/core/Module.html#method-i-3D-3D-3D 看这个
Ruby 的三等是用在 case 语句的
试过 Rails 6.0.0, 5.0.6,都能订阅非 200 请求。 不存在的页面看你有没有专门的 controller 处理,有的话也能被订阅到。
lib
目录加到autoload_pathes
config.autoload_paths << Rails.root.join('lib')
Api::V2::UserController
, 要在autoload_paths
下面有api/v2/user_controller.rb
文件才可以。参考 https://guides.rubyonrails.org/autoloading_and_reloading_constants.html
用了一下,通过 css loader 加载的 css 在 html 中不带 data-turbolinks-track 的属性,页面切换的时候 css 加载会慢半拍。没有仔细看 css loader 文档不知道有没有方便加标签属性的方法……
老外标题党,结尾都说自己都不信,转过来再断章取义……
能招这么多年,起码说明人家业务稳中见长
Kernel.autoload
不是实例变量的坑,是def
打开一个跟上下文不联通的作用域,不管是不是在singleton_class
里,要理解 ruby 的作用域,代码应该是
class C
@c = 1
class << C
def f
@c
end
end
end
strong parameters
是让你设一个 white list allow list,让你标记传到 action 里面的参数哪个是可以接受的,并不是用来取参数的。
试一下
def shipping_charge_temp_params
params.permit(:name, :shipping_charge_method_id,
shipping_methods: %i[name
base_items base_price
increment_items_unit
increment_items_unit_price])
end
又看了一眼,教程的 Gemfile 里有一个 minitest 的 plugin minitest-reporters
,minitest 报错堆栈里就有这个 gem
这个教程好害人,要不是你贴的信息全,没人知道为什么。
应该是教程的 Gemfile 有问题,导致 minitest fail 的时候测试框架本身出错了,没法继续。
简单 fix 就是用 rails new 之后生成的 Gemfile,不要用教程的 Gemfile。
你要想深究原因,可以/home/sws/.rvm/gems/ruby-2.4.4/gems/railties-5.1.2/lib/rails/test_unit/reporter.rb
设个断点自己 debug 一下,鉴于你是新手,还是不要折腾了。
你跑测试的输出贴全了看一下,最后会有一个结果的,4 个 test 肯定都会跑
我没看过那个教程,如果完全按照你描述的步骤,这个测试失败是符合期望的,因为你现在只能响应static_pages_home_url
, static_pages_help_url
教程应该是教你测试驱动开发,先写测试,再补全实现的代码。你看下面是不是让你加about
页面
看一下你的config/routes.rb
文件
看你的测试父类是什么。如果是ActionDispatch::IntegrationTest
的话可以用static_pages_about_url
如果喜欢changeset
,可以在调#save
之前把before_validation
, validation
, before_save
都手动调一遍,效果差不多。
看到挖矿要用到全球 0.13% 的电,感觉好浪费
学习的劲头值得鼓励,笔记自己记录一下就好了,毕竟写给别人看还要琢磨用词,还要排版都需要花费很大精力。
关键字Single-table inheritance