gpt4 book ai didi

perl 多任务问题

转载 作者:行者123 更新时间:2023-12-04 23:09:59 25 4
gpt4 key购买 nike

我已经完成了我早期的使用 perl 线程的多线程程序,它可以在我的系统上运行。问题是在一些需要运行的系统上,线程支持没有编译到 perl 中,我无法安装额外的包。因此,我需要使用线程以外的东西,并且我正在将我的代码移动到使用 fork()。这适用于我的 Windows 系统启动子任务。

几个问题:

  • 如何判断子进程何时退出?当线程数低于某个值时,我创建了新线程,我需要跟踪正在运行的线程数。对于进程,我如何知道一个何时退出,以便我可以跟踪当时存在的数量,在创建一个计数器时增加一个计数器,在一个退出时减少一个计数器?
  • 当父进程打开时,使用 OPEN 获得的句柄的文件 I/O 在子进程中是否安全?我需要为每个子进程附加到一个文件中,这在 unix 上是否也安全。
  • 有没有 fork 和线程的替代品?我尝试使用 Parallel::ForkManager,但它没有安装在我的系统上(使用 Parallel::ForkManager;出现错误),我绝对要求我的 perl 脚本可以在所有 unix/windows 系统上运行,而无需安装任何额外的模块。
  • 最佳答案

    典型用法:

    use POSIX ':sys_wait_h';    # for &WNOHANG

    # how to create a new background process
    $pid = fork();
    if (!defined $pid) { die "fork() failed!" }
    if ($pid == 0) { # child
    # ... do stuff in background ...
    exit 0; # don't forget to exit or die from the child process
    }
    # else this is the parent, $pid contains process id of child process
    # ... do stuff in foreground ...

    # how to tell if a process is finished
    # also see perldoc perlipc
    $pid = waitpid -1, 0; # blocking wait for any process
    $pid = wait; # blocking wait for any process
    $pid = waitpid $mypid, 0; # blocking wait for process $mypid
    # after blocking wait/waitpid
    if ($pid == -1) {
    print "All child processes are finished.\n";
    } else {
    print "Process $pid is finished.\n";
    print "The exit status of process $pid was $?\n";
    }

    $pid = waitpid -1, &WNOHANG; # non-blocking wait for any process
    $pid = waitpid $mypid, 0; # blocking wait for process $mypid
    if ($pid == -1) {
    print "No child processes have finished since last wait/waitpid call.\n";
    } else {
    print "Process $pid is finished.\n";
    print "The exit status of process $pid was $?\n";
    }

    # terminating a process - see perldoc -f kill or perldoc perlipc
    # this can be flaky on Windows
    kill 'INT', $pid; # send SIGINT to process $pid

    perldoc -f fork 中的血腥细节, waitpid , wait , kill , 和 perlipc . perlipc 中的内容关于为 SIGCHLD 设置处理程序events 应该特别有用,尽管 Windows 不支持。

    跨分支进程的 I/O 在 Unix 和 Windows 上通常是安全的。文件描述符是共享的,所以对于这样的事情
    open X, ">", $file;
    if (fork() == 0) { # in child
    print X "Child\n";
    close X;
    exit 0;
    }
    # in parent
    sleep 1;
    print X "Parent\n";
    close X;

    子进程和父进程都将成功写入同一个文件(但请注意输出缓冲)。

    关于perl 多任务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3066626/

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