新手问题 异步任务怎么用?

u1453357893 · 2016年04月04日 · 最后由 easonlovewan 回复于 2016年04月05日 · 3404 次阅读

1,在一个 model: Student 中定义了一个 perform 如下:

@queue = :xxx

def self.perform
  Student.create(name: "fasdf", age: 34,........)
end

我有一个 api 代码如下:

def play
  async_input_datas
end

private

def async_input_datas
  Resque.enqueue(Student)
end

我现在想实现的就是前端或者安卓调用我的 api 的时候,怎么去异步执行 perform 方法呢?这一套流程还缺少什么?我在调用 async_input_datas 的时候为什么没有执行 perform 方法呢?我怎么做才能算是真正意义上的异步处理呢?看到 github 上的 code 如下:

klass, args = Resque.reserve(@queue)
klass.perform(*args) if klass.respond_to? :perform
......
QUEUE=file_serve rake resque:work

如上的代码又有什么作用呢?求大神指点,感激不尽

你在调用 async_input_datas 的时候,是把异步任务放倒队列中,而异步队列的实际执行是独立于你的 API 进程之外的另外一个进程,你需要启动这个 Resque 队列处理进程,有个很老的视频教程,不知道能否帮你解决问题 http://railscasts.com/episodes/271-resque

#1 楼 @lgn21st 是的之前可能只是将异步任务放到了队列里边儿,可是看了这个帖子还是不知道怎么去执行这个 perform!!!还有就是 perform 方法必须放到 app/workers 下的指定文件中吗?我现在是放到我指定的 model 中了,不知道这个有没有影响,还有就是 resque_auth.rb 这个文件的具体作用是什么?

@lgn21st 现在知道问题所在了,已经把指定的 perform 塞进队列里边儿了,可是怎么在 console 中执行 rake resque:work QUEUE='*' ?因为我想实现的是,塞进去之后,就立马执行这个 perform!!!,可我总不能塞进去之后手动执行 rake resque:work QUEUE=xxx 吧😅

#3 楼 @u1453357893 rake resque:work QUEUE='*' 不是在 rails console 中执行,是在启动项目的时候,在终端执行。好比 rails s。所以,部署服务器的时候 就需要执行这条命令。这样 就开启这个进程专门处理队列,正常情况下,这个进程是不会关闭的。你可以选择用 sidekiq。不过 还是要看你的场景需不需要用到异步队列了,塞进队列,不会立马执行 perform(需要立马执行就不用异步队列了吧?),而是根据队列的性质,前面先进队列的 work 会先执行,等轮到这个 work 了才会执行

#4 楼 @pathbox 你指的部署服务器是指什么时候?我可以这样理解吗?PS:先说下我的场景,前端安卓那边儿不定时的给我发一大堆文件,我这边儿要先保存(处理)这些文件,然后存入不同的库中,也就是数据库中(也就是要定义不同的 perform)完。 我启动项目(rails s)之后,安卓要访问我这边儿的 api(它会多次不定时的访问),在访问我这个 api 之后,这时候 reids 就存了好多待执行的脚本(把异步任务放到队列中),我需要在终端执行 rake resque:work QUEUE='*',这样是不是所有 perform(这些)都会按照顺序执行呢?其实还是不太理解把异步放入队列中之后,我怎么去执行这些队列的

启动项目 rails s 的时候,再打开一个窗口 执行 rake resque:work QUEUE='*' 不要把这个窗口关闭。之后 安卓端给服务器端发数据或调 api,你的这个 api 里面包含了异步任务的代码,异步任务的代码 就是与 perform 有关的代码。当安卓端调相关的 api 的时候,服务端代码执行到 perform 的相关代码的时候,就会往 redis 里塞队列任务,等队列轮到某次任务的时候,会自己在另一个进程执行,不需要你做任何动作。简单的理解执行操作:因为开始的时候你已经开了一个进程,这个进程是专门从队列里取任务并且执行。看你上面的说明,你好像对异步队列的执行逻辑搞错了

#6 楼 @pathbox 感谢,现在明白了

#7 楼 @easonlovewan 咦?你是 lz 么???

#8 楼 @pathbox lz?好熟悉的 name,你是?

#10 楼 @pathbox 好尴尬😅不过遇到了相同问题

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