用 channel 就好了
channel = Channel(Nil).new()
spawn do
sleep 3
puts "fiber done."
channel.send(nil)
end
channel.receive
我当时的需求是做个 server 端的 event track sdk,所以需要异步处理并且尽量不依赖第三方包。
不过既然你用了 concurrent ruby,感觉是不是直接用 actor 代替 queue 会更直观。
require 'concurrent'
require 'concurrent-edge'
class JobActor < Concurrent::Actor::Context
Message = Struct.new(:action, :value)
def initialize
@jobs = []
@timer = Concurrent::TimerTask.new(execution_interval: 5) do
puts 'time to flush.'
flush
end.execute
end
def on_message(message)
case message.action
when :add then push(message.value)
when :flush then flush
end
end
private
def push(value)
flush if @jobs.size == 20
@jobs << value
end
def flush
jobs = @jobs.map(&:itself)
@jobs = []
p jobs
end
end
actor = JobActor.spawn name: 'job_actor'
67.times do |i|
actor.tell(JobActor::Message.new(:add, i))
end
callback 看起来跟 push 是在同一个线程,如果 callback 是耗时较长的操作,好像 push 会卡住的
之前写 server 端 ab testing 的时候看过,貌似没有现成的。最后自己用线程实现了
核心代码就几行。
thread = Thread.new { sleep(5) and mutex.synchronize { flush(jobs) } while true } # 定时 5 秒 flush
mutex.synchronize { thread.wakeup if jobs.push(job).size > 10 } # push 时检查数组大小,超过则 flush
at_exit { mutex.synchronize { flush(jobs) } } # 退出时 flush
事实上写代码的思维比语言对性能的影响更大,比如这种递归写过 fp 的人会优先考虑 tco 的.
如果想要像 activeadmin 那种开箱即用的可以试试 trestle,基于 bootstrap
这个是真的不错
11 月份刚去成都玩了几天,是个好地方
现在的虚拟货币跟黄金有点像,但是金本位早没了。同样,比特币也不可能有法币的职能。充其量就一个充满泡沫的投资商品,有闲钱可以进场,是不是韭菜就看个人造化了。
至于区块链,据目测应用场景貌似还在探索中,暂时没看到未来。作为技术储备闲着可以看看,但跟入币圈完全是两码事,不理解为啥你要扯在一起讲。
我觉得去 go 社区拼命吹 rust 有多好,go 一无是处也是被喷的下场。个别信徒一个劲地吹新语言新框架有多好顺便贬低 rails,看着都烦。要不开个贴写点干货对比对比,别留一句话然后转身就跑。
kemal 和 amber 比优势不大。性能上没有多大差距,而 amber 有自己的 cli,有 orm,console 和 router。虽然说是这么说,但如果现在要用的话也只能用 kemal 了。
amber 吧,虽然还是很起步阶段。但语法亲近,性能高,开发也活跃。配套的 micrate
解决了 migration,webpack 解决 assets pipline。就是要等到 crystal 和 amber 能在生产环境使用可能还需要挺长一段时间。
这个需要看 string:sub_string/3
和 lists:reverse/1
的实现。
首先是 string:sub_string
, 这个函数通过 cons 递归截取。erlang 实现
然后就是 lists:reverse/1
,这个函数虽然也是 erlang 实现,但是主要通过 lists:reverse/2
实现 reverse,而后者是 bif,也就是性能会比使用 erlang 实现的函数高上许多。大概就是这样
block
, lambda
, first-class function
,anonymous class
都在各自语言平台上大量使用,各种回调都能看到。但本质上都是一类东西。yield
, &block
,但这只是开发者本身素质问题,并不是语言问题。yield
并不多,大部分是在一些封装起来的类库中使用。b1, b2, b3
或者 yield
意义不明,那么 js 那一段也一样不明所以,甚至连 c1, c2, c3
传进去是不是函数都不确定。这个不关 block 或者 function 的事,这类问题上类型系统。不建议这么做,这样的话后面有同样问题的同学就搜不到答案了
在 Ruby 里面,local variable 和 setter method 还是挺容易区分的。前者就是一个赋值过程,左值是一个变量。而后者是一个 send message 的过程 + 包装了一层语法糖,self.color = :orange
实际上等同于 self.send('color=', :orange)
,意思是向 self
对象发送一个消息 color=
的信号,参数为 :orange
霸爷和强哥的博客都是之前学 Erlang 常逛的地方,可惜现在都不更新了
我还在重构,看看这两天能不能提 pr? https://github.com/IceskYsl/worklogs/compare/master...aiasfina:3.x?expand=1
D lang => C 已死,Scala => Java 已死,F# => C# 已死,Node => Ruby 已死,Meteor => Rails 已死......就我个人印象中就有以上那么多论调了,但实际上谁也没死。
如果 beam/otp 真的能解决痛点,我觉得 erlang 根本就不是问题,况且个人觉得 erlang 语言本身真的没有那么不堪。。
你用 webpacker 管理 js 的话,直接用 `${}` 就行了,自带 babel-loader
会转换的
没有 Scala 吗(逃
capistrano 实测是不用的,跟以前一样跑 assets:precompile
就行了。但是会有一个 yarn install deps 的过程,慢得飞起,而把 node_modules 设置为 link_dir 会出问题。
symbol to proc 没法带参数,可以用 lambda to proc a.map &->(_){_[:aa]}
,但还不如直接用 block
docker swarm 已经被 swarmkit 干掉了,新的 swarmkit 发展下去可能会对 k8s 有点影响,不过目前还不稳定,而且国内实在是冷。
这个可以有,今晚把用户自定义的功能补上
可能会有一些坑。因为这个是 java 项目,数据表设计可能会与 rails 冲突,比如联合主键,命名不规范,占用保留字段名等等。不确定你要用多久能搞定。
当你确定能顺利读出数据,那就好办了。先把读出来的数据组织成前端需要的形式,在确定能显示之后再考虑聚合的数据要放哪里。
yarn 比之前的 rails-assest 靠谱多了。
另外,我这里测试 yarn 不换源也非常快。就是每次运行 yarn 都要 rebuild node-sass,自己手动用 webpack 搭建并没有这个问题
...好吧 你说模式,我理解成设计模式应该不过分吧,毕竟以前有跟元编程一起讨论过。另外,我只是根据自己的理解跟你讨论一下而已,哪个字眼表现出我装来了,我改= =