代码之家  ›  专栏  ›  技术社区  ›  dsm

有没有一种方法可以用Perl管理进程(即,一个线程替换,它实际上可以工作)?

  •  3
  • dsm  · 技术社区  · 16 年前

    我有一个Perl中的多线程应用程序,我必须依赖几个非线程安全模块,所以我一直在使用 fork() ED流程 kill() 作为消息传递接口的信号。

    问题是信号处理程序有点不稳定(至少可以这么说),并且常常以在不适当状态下被杀死的进程结束。

    有更好的方法吗?

    4 回复  |  直到 11 年前
        1
  •  4
  •   tye    16 年前

    看一看 forks.pm ,这是一个“使用fork()替换Perl线程”的插件,它使内存使用更加合理(但不要在win32上使用它)。它将允许您声明“共享”变量,然后在进程之间自动传递对这些变量所做的更改(类似于threads.pm的工作方式)。

        2
  •  7
  •   xdg    16 年前

    根据您的程序需要做什么,您可以考虑使用 POE 这是一个Perl框架,用于具有用户空间线程的多线程应用程序。它很复杂,但是很优雅和强大,通过将活动限制在单个Perl解释器线程上,可以帮助您避免非线程安全的模块。

    开始使用的有用资源:

    另外还有上百个预建的 POE components 您可以使用组装成应用程序。

        3
  •  6
  •   innaM    16 年前

    您总是可以在父级和子级之间有一个管道来来回传递消息。

    pipe my $reader, my $writer;
    my $pid = fork();
    if ( $pid == 0 ) {
        close $reader;
        ...
    }
    else {
        close $writer;
        my $msg_from_child = <$reader>;
        ....
    }
    

    不是一种非常舒适的编程方式,但它不应该是“不稳定的”。

        4
  •  1
  •   szabgab Brandon Fosdick    11 年前

    从Perl5.8开始,您应该查看核心线程模块。看一看 http://metacpan.org/pod/threads

    如果您想使用非线程安全的模块,通常可以在线程入口点内加载它们,并导入它们。