gpt4 book ai didi

ruby - 如何要求 ruby​​ pry 停止所有其他线程

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:53 25 4
gpt4 key购买 nike

我正在尝试调试多线程 ruby​​ 脚本,问题是我什么时候做

binding.pry

其他线程继续向控制台发送输出。如何让它们在 binding.pry 处停止,然后在我退出时重新启动?我想在 .pryrc 中有一种方法可以做到这一点

最佳答案

这听起来像是您提议使用 binding.pry 的调用来询问所有子线程并暂停它们,直到您结束 pry session 。由于技术和实际原因,这是不可能的。 BindingThread 类不是这样工作的,Ruby 中的多线程也不是那样工作的。

Ruby 中的线程只能通过调用Kernel#sleepThread.stop 来暂停。 (并且它们在功能上是等效的)重要的是,这些方法只能在当前线程 上调用。 One thread cannot suspend another thread . (Thread.stop是类方法,不是实例方法)

让我们看看 binding.pry 实际做了什么:类 Binding 的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。因此,当您将 binding.pry 放入您的代码中时,您是在告诉 Ruby 封装当前线程的执行上下文。

这意味着当您在主线程中调用 binding.pry 时,Binding 对象具有当前线程 的上下文并且可以告诉自己休眠,但是核心Ruby Thread 类不允许它通知任何其他线程休眠。

即使它确实支持它,它也会很奇怪并且容易出错,并且会引起很多麻烦。想象一下,您有这样的代码:

# we are in the main thread
Thread.new do
# we are in the child thread
foo = Foo.new(bar.fetch(:baz, {}))
foo.save
end

# we are in the main thread
binding.pry

因为 Ruby 处理 context-switching 的方式,如果 binding.pry 告诉所有子线程停止,那么子线程可能会在调用堆栈中的任何位置停止,包括 Foo.new 代码中的任何位置.保存。让那些线程在执行您未编写的代码的过程中暂停和恢复会给您带来麻烦。例如,如果池中的 ActiveRecord 连接被 checkout 并用于 SELECT 查询,但线程在将连接返回到池之前和收到响应之前进入休眠状态,会发生什么情况?坏东西。很多坏东西。

听起来真正的解决方案是更改子线程的冗长程度。如果您正在对繁琐的代码进行故障排除,而当您尝试在单个线程中工作时您的其他线程很嘈杂,那么请将其他线程设置为暂时使用较低的日志记录级别。

关于ruby - 如何要求 ruby​​ pry 停止所有其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44222913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com