【问题标题】:Safe fire and forget method in PerlPerl 中的安全触发和遗忘方法
【发布时间】:2015-08-18 11:17:00
【问题描述】:

我需要在我的 Perl 代码中异步执行一个方法(不是进程),但我必须确保此代码永远不会引发任何异常并停止我的主要任务执行。

什么是异步调用方法并消除任何潜在异常的最佳方法,无论它是被调用的方法内部异常还是线程异常?

在 Java 中我们会有这样的东西:

// my task runs here
try {
    // assyncrounous method invocation (fire and forget)
    new MyThread().start();
} catch (Throwable e) {
    // Silent any error
}
// my task continues here

【问题讨论】:

  • fork 有什么问题?
  • 那个try catch是没用的;它不会捕获线程抛出的错误。

标签: multithreading perl exception-handling thread-safety


【解决方案1】:

如果您想异步执行任意代码,您有两种选择:您可以在单独的进程中运行它,或者您可以在单独的线程中运行它。使用单独的进程会更加健壮,但您可以使用线程。

use threads;
my $thread = async { code() };

join 等待它完成的线程。

【讨论】:

  • 一个 eval 块会隔离任何异常吗?
  • 没有。只有在它完成之后。
  • 抛出异常后如何完成?
  • 如果它抛出异常,只有异步代码应该停止。 “主要”流程将继续。
  • 所以你确实希望线程退出。所以不需要捕捉任何异常。
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2011-01-09
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多