ruby multithreading - 停止并恢复特定线程

时间:2014-10-14 10:06:04

标签: ruby multithreading

我希望能够在以下上下文中停止并运行ruby中的特定线程:

thread_hash = Hash.new()
loop do
  Thread.start(call.function) do |execute|
    operation = execute.extract(some_value_from_incoming_message)
    if thread_hash.has_key? operation
      thread_hash[operation].run
    elsif !thread_hash.has_key?
      thread_hash[operation] = Thread.current
      do_something_else_1
      Thread.stop
      do_something_else_2
      Thread.stop
      do_something_else_3
      thread_hash.delete(operation)
    else
      exit
    end
  end
end

在上面的人类语言脚本中,充当接收消息的服务器,从传入消息中提取一些参数。如果该参数已经在thread_hash中,则应该恢复挂起的线程。

如果thread_hash中不存在参数,则参数以及线程id存储在thread_hash中,执行某些函数并暂停当前线程,直到在新循环中重新开始,直到执行do_something_else_3函数并执行操作为止当前线程从哈希中删除。

可以根据线程ID在Ruby中恢复线程,或者在开始时如果新线程被赋予名称

thr = Thread.start 

并且只能通过以下名称恢复:

thr.run

上述解决方案是否真实?由于新线程中的旧线程恢复会导致某种泄漏/死锁,还是由Ruby自动处理冗余线程?

1 个答案:

答案 0 :(得分:0)

听起来像你在尝试在每个线程中做所有事情:读取输入,运行现有线程,存储新线程,删除旧线程。为什么不分手呢?

hash = {}

loop do
  operation = get_value_from message

  if hash[operation] and hash[operation].alive?
    hash[operation].wakeup
  else
    hash[operation] = Thread.new do
      do_something1
      Thread.stop
      do_something2
      Thread.stop
      do_something3
    end
  end
end

不是将循环的全部内容包装在一个线程中,而是仅对消息处理代码进行线程化。这使得它可以在后台运行,同时循环返回等待消息。这解决了任何种类/死锁问题,因为所有线程管理都发生在主线程中。