新手问题 如何实现实时的并行处理

samport · 2018年04月24日 · 最后由 jjym 回复于 2018年05月03日 · 2788 次阅读

最近我正在写一个比特币的自动交易脚本。想实现并行 (或称为异步?后台任务?) 同时调用买和卖两个方法。目前使用的是concurrent-ruby这个 gem。不知道什么原因有时候会造成多次重复执行,可能在某个地方有 retry 的机制吧。

这种异步的实时并行处理,大家推荐用什么?sidekiq 的话,需要启动两个服务:redis+sidekiq,感觉有点笨重,不知道可靠性怎么样?

示例代码:

class Trader
  # gem的官网:https://github.com/ruby-concurrency/concurrent-ruby
  include Concurrent::Async

  def initialize
    # init api client
  end

  def buy(price, size)
    # call buy api
  end

  def sell(price, size)
    # call sell api
  end
end

调用样例:

my_trader = Trader.new

# 普通调用方式
my_trader.buy(11, 0.1)
my_trader.sell(12, 0.1)

# 异步调用方式
my_trader.async.buy(11, 0.1)
my_trader.async.sell(12, 0.1)

并行可是指的是物理上的同时进行。和异步 后台任务。不是一个概念

这里要用事务吧

parallel 了解一下

不太理解你的需求,尝试详细描述一下?

重复执行的话应该是因为你写错了。

一般 Web 后端用 Sidekiq 比较好,原因是你可以看到哪些任务报错了,哪些执行了,而且不会因为你退出 Web server 而意外中断请求,导致不知道请求发没发出去。

简单点的话用 concurrent-ruby 也不错,直接用 Executor 就挺方便。 Call API 时 IO 是由 linux 内核帮你处理的,你只是调用 linux 内核接口,告诉它需要发送一些包,然后内核帮你处理,程序在这里等着处理完成。所以并行在这里是不存在的,应该叫并发,就是你告诉 linux 内核要发两个请求,然后同时等这两个完成

最简单的方法就是

t1= Thread.new{buy..}
t2 = Thread.new{sell..}
t1.join;t2.join

但还是推荐 concurrent-ruby 实现的 ExecutorPool, 可以控制线程数量

作死一点的话你也可以试试最近的高科技并发库 https://github.com/socketry/lightio

需要 登录 后方可回复, 如果你还没有账号请 注册新账号