【问题标题】:Quit multithreaded/multi-process web server退出多线程/多进程 Web 服务器
【发布时间】:2012-03-24 19:56:25
【问题描述】:

我正在编写一个 http 服务器。有一个主守护进程产生一堆侦听器,这些侦听器是线程或进程,具体取决于用户设置。在创建监听器时,套接字描述符被传递给它,它的工作只是监听连接(duh)。一个信号量正在包装对listen 的调用,以避免雷鸣般的羊群效应。

我的问题是如何退出服务器。在这种情况下,侦听器在信号量上被阻塞,守护进程将如何告诉他们关闭?守护进程不能只是杀死他们,也许有人正在响应请求......

我想让设计尽可能简单,但我找不到解决这个问题的方法。

这里有一些丑陋的解决方法:

  • 为信号量设置超时。醒来。我应该关闭吗?不?好的,回去睡觉;
  • 杀了他们;
  • 共享内存中的布尔数组,表示响应/阻塞,守护进程相应地终止。迄今为止最好的,但不是那么简单。

你说什么? 谢谢。

【问题讨论】:

    标签: c multithreading multiprocessing


    【解决方案1】:

    解决此问题的一种简洁方法是让每个侦听器等待两个信号量。第一个是你现在使用的当前的,第二个,当发出信号时,意味着是时候退出了。我相信您的系统是 linux,因为您使用了术语 daemon。函数select 就是这样做的——等待多个对象(如文件描述符),并在其中一个对象发出信号时返回。您还可以从函数中知道哪个收到了信号,所以这是您的解决方案。

    在 Windows 上,函数是 WaitForMultipleObjects()

    【讨论】:

    • 哇。我喜欢这个。 select 非常适合这种情况。
    【解决方案2】:

    向孩子发送 SIGTERM 或者,如果您愿意,可以发送 SIGUSR 并实现对这个信号的处理,以便他们完成当前请求并优雅地退出。 如果他们等待信号量,您应该使用可中断模式,以便接收信号将唤醒他们。

    【讨论】:

      【解决方案3】:

      过去,我使用了一个全局变量,客户端处理线程可以使用它来确定他们是否需要“清理商店”,然后等待它们全部完成,但我也很想知道是否有更好的方法。 (不确定是什么语言,但在大多数情况下,您可以检查您的线程是否仍在运行。)

      【讨论】:

      • 不能那样做。监听器/阻塞/在信号量上,他们不能自己做任何事情,比如检查变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2016-11-02
      相关资源
      最近更新 更多