如何在铁轨上的红宝石中工作?

时间:2014-04-23 13:08:15

标签: ruby-on-rails ruby multithreading

我需要一些帮助,因为我有一段代码int rails,即在email_open_order操作中执行,以便我可以在后台运行电子邮件任务并释放GUI。

def email_open_order  
  @order_list = OpenOrder.where(:user_id => current_user)
  t = Thread.new { invoke_webservice method: 'post', action: 'send_open_order', data: { custNo: current_user,custEm: session[:buyer_email], orders: @order_list} }

  at_exit { t.join }
end

invoke_webservice方法调用Web服务,即HTTP POST并向用户组发送电子邮件。

交付所有未结订单清单所需的正常时间为87.12

Benchmark.measure { invoke_webservice method: 'post', action: 'send_open_order', data: { custNo: current_user,custEm: session[:buyer_email], orders: @order_list} }
=> 0.010000 0.000000 0.010000 ( 87.124463)

一旦我创建一个新线程并将invoke_webservice方法传递给线程块,它就会开始发送邮件并释放GUI。

我想知道当代码块的执行完成/失败时,线程会发生什么。

线程是终止还是处于睡眠模式?

这个主题如何运作?它会创建一个新的PID吗?

我使用Unicorn作为我的网络服务器。

先谢谢

2 个答案:

答案 0 :(得分:1)

它不会创建新的PID(因为这意味着新进程而不是新线程)。当线程完成你的工作后,它将终止。

通常rails应用程序通过使用delayed_job,sidekiq等来执行此操作,以在单独的进程中处理这些作业,而不是通过在应用程序中创建线程 - 它经常不确定Web服务器进程将在多长时间后存活请求已完成(乘客根据负载启动/终止应用程序流程),您无法充分了解这些线程的状态。

答案 1 :(得分:0)

我知道了,但一旦终止,线程会引起任何问题。 我有一个应用程序,我需要发送邮件,我不想使用任何后台工作。

我创建的线程只需7秒即可处理和终止,我是否需要销毁线程对象,如:

thread = Thread.new { 4+7 }
thread.destroy