如何在线程化的Ruby程序中找到错误?

oyxsuwqo  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(102)

在一个线程中,我正在执行以下操作:

builder_thread = Thread.new do
    FileUtils.cp_r(folder,dest)
    io_object = IO.popen(command)
    Thread.current["output"] = ""
    Thread.current["pid"] = io_object.pid
    Thread.current["basedir"] = dest
    io_object.each { |out| Thread.current["output"] += out }
end

当我像thread_var["output"]一样访问线程的输出时,这可以正常工作。但是,如果我将代码转换为:

builder_thread = Thread.new do
    dest = File.join(root_dir,"mydir")
    FileUtils.cp_r(folder,dest)
    io_object = IO.popen(command)
    Thread.current["output"] = ""
    Thread.current["pid"] = io_object.pid
    Thread.current["basedir"] = dest
    io_object.each { |out| Thread.current["output"] += out }
end

当我尝试访问thread_var["output"]时,它的值为nil,就像下面的代码io_object = IO.popen(command)没有被执行一样。在第一种情况下,我在dest文件夹到达线程之前创建了它。在第二种情况下,我在线程中创建了它。我怎么能找出问题所在呢?我是Ruby线程的初学者。

编辑

在该线程内执行的命令可能需要很长时间才能完成。同时,我希望能够访问thread_var["output"]变量并查看命令的执行情况。如果我在访问值之前加入线程,一切正常。然而,加入线程可能需要很长时间,我不想这样做。有没有办法解决这个问题?

5gfr0r5j

5gfr0r5j1#

有可能是一个异常被引发了。除了主线程之外的其他线程中的异常不会被打印到控制台--它们只是导致线程停止运行。

相关问题