Multithreading perl cgi线程

Multithreading perl cgi线程,multithreading,perl,cgi,perl5.12,Multithreading,Perl,Cgi,Perl5.12,我的cgi web应用程序有点问题,我使用ithreads进行一些并行处理,所有线程都有一个共同的“目标”。因此,我分离了所有这些,一旦我找到了答案,我就调用exit。 然而,问题是,即使用户关闭连接并离开,脚本实际上仍将继续处理,当然,如果从资源角度来看,这是一个问题。 如果用户已断开连接,有没有办法强制父进程退出?AFAIK创建和销毁线程(至少现在)不是一个好的Perl实践,因为它会不断增加内存使用率 你应该用其他的方法来完成这项工作。通常,解决方案是在共享阵列的帮助下创建一个线程池并发送参

我的cgi web应用程序有点问题,我使用ithreads进行一些并行处理,所有线程都有一个共同的“目标”。因此,我分离了所有这些,一旦我找到了答案,我就调用exit。 然而,问题是,即使用户关闭连接并离开,脚本实际上仍将继续处理,当然,如果从资源角度来看,这是一个问题。
如果用户已断开连接,有没有办法强制父进程退出?

AFAIK创建和销毁线程(至少现在)不是一个好的Perl实践,因为它会不断增加内存使用率

你应该用其他的方法来完成这项工作。通常,解决方案是在共享阵列的帮助下创建一个线程池并发送参数。如果您在Apache下运行,如果客户端过早关闭连接,它会向cgi进程发送SIGTERM。在我的简单测试中,这将作为默认行为终止脚本和线程


但是,如果服务器和客户端之间有一个代理,Apache可能无法检测到关闭的连接(因为从服务器到代理的连接可能会保持打开)-在这种情况下,您就不走运了。

我不确定如何检测用户是否断开了连接,但是,如果他们断开了连接,你必须让线程自行停止,因为它们显然不是自动终止的

销毁线程是一项危险的操作,因此没有一种好的方法

据我所知,标准的方法是使用一个共享变量,线程定期检查该变量,以确定它们是否应该继续工作。在退出之前将其设置为某个值,并在线程中检查该值


您还可以向线程发送信号以终止它们。比我更了解这一点。

我个人建议您改变方法,在为客户端连接创建这些线程时,将保存每个线程的PID并将其与客户端连接关联。我个人喜欢使用守护进程而不是线程,即Proc::Daemon。当客户端过早断开连接时(在线程完成之前),向与该客户端关联的每个进程ID发送SIGTERM

要优雅地退出,请使用停止条件覆盖线程进程中的终止子进程,如下所示:

$SIG{TERM} = sub { $continue = 0; };

其中$continue是线程处理循环的条件。您仍然需要注意代码错误,因为即使您可以尝试重写
$SIG{{{uuuu DIE\uuuu}
,DIE()方法通常也不尊重这一点,并且会在没有宽限期的情况下立即死亡;)(至少从我的经验来看)

你能发布一个代码示例吗?如果不知道CGI运行的环境,这是不可能回答的。我猜您运行的是Apache+mod_perl,并且在httpd.conf中配置了KeepAlive?我知道这有点晚了,但无论如何,您是正确的,使用线程队列是正确的方法