我希望能够在以下上下文中停止并运行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自动处理冗余线程?
答案 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
不是将循环的全部内容包装在一个线程中,而是仅对消息处理代码进行线程化。这使得它可以在后台运行,同时循环返回等待消息。这解决了任何种类/死锁问题,因为所有线程管理都发生在主线程中。