2

我的 cgi Web 应用程序有点问题,我使用 ithreads 进行一些并行处理,其中所有线程都有一个共同的“目标”。因此,我将它们全部分离,一旦找到答案,我就会调用 exit。然而问题是即使在用户关闭连接并离开后脚本实际上仍会继续处理,这当然是资源方面的问题。如果用户断开连接,有什么方法可以强制退出父进程?

4

4 回答 4

4

如果您在 Apache 下运行,如果客户端过早关闭连接,它会向 cgi 进程发送一个 SIGTERM。在我的简单测试中,这会杀死脚本和线程作为默认行为。

但是,如果服务器和客户端之间存在代理,则 Apache 可能无法检测到关闭的连接(因为从服务器到代理的连接可能保持打开状态)——在这种情况下,你就出局了运气。

于 2011-07-13T16:27:46.467 回答
3

AFAIK 创建和销毁线程(至少现在)不是一个好的 Perl 实践,因为它会不断增加内存使用量!
您应该以其他方式思考以完成工作。通常解决方案是创建一个线程池并在共享数组或Thread::Queue的帮助下发送参数。

于 2011-07-01T22:25:27.003 回答
1

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

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

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

其中 $continue 将是线程处理循环的条件。您仍然需要注意代码错误,因为即使您可以尝试覆盖$SIG{__DIE__}, die() 方法通常不会尊重这一点,并且会立即死亡;)(至少根据我的经验)

于 2011-07-17T17:47:40.270 回答
0

我不确定您如何检测用户是否已断开连接,但是,如果有,您必须让线程自己停止,因为它们显然不会被自动杀死。

销毁线程是一个危险的操作,所以没有一个好的方法来做到这一点。

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

您还可以向线程发送信号以杀死它们。文档比我更了解这一点。

于 2011-07-15T14:35:37.863 回答