- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图在一个更大的程序中找出一个问题,并编写了这个小测试程序来帮助解决它。
如果我启动一个 http 服务器,然后立即尝试将其关闭,它不会关闭并继续为请求提供服务。我可以对这种行为进行推理,但无法找到解决方法。我假设这是因为服务器在我尝试将其关闭之前尚未完全启动,因此关闭失败并继续启动,然后完成离开它以正常处理请求。
在调用关闭之前,如何确保服务器处于可以关闭的状态?如果您注释掉启动和停止服务器之间的 sleep 功能,您将看到它按预期工作。
package main
import (
"context"
"fmt"
"io"
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main() {
// stop on ^c
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
// router
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("serving request")
io.WriteString(w, "Hello, world!\n")
})
// start server
srv := &http.Server{Addr: ":8080", Handler: mux}
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Printf("listenAndServe failed: %v", err)
}
}()
fmt.Println("server started")
// time.Sleep(1 * time.Second)
// gracefully stop server
d := time.Now().Add(60 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), d)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
fmt.Println(err)
}
fmt.Println("server stopped")
<-quit
}
只需运行此程序并访问 http://localhost:8080 .您会看到它会继续为请求提供服务,即使我们试图将其关闭也是如此。
程序的输出应该是:
:; go run main.go
server started
server stopped
2017/07/22 16:17:11 serve failed: http: Server closed
相反,它是:
:; go run main.go
server started
server stopped
serving request
serving request
serving request
最佳答案
您调用 srv.ListenAndServe
可以,而且显然是在 srv.Shutdown
之后调用.您可以通过在调用 srv.ListenAndServe
之前向 goroutine 添加日志记录语句来验证这一点.查看在 ListenAndServe
之后调用时关闭是否有效, 你可以取消注释你的 time.Sleep(1 * time.Second)
.这里是 Shutdown
的典型用法会在你的 <-quit
之后立即调用它:
func main() {
// stop on ^c
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
// router
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Println("serving request")
io.WriteString(w, "Hello, world!\n")
})
// start server
srv := &http.Server{Addr: ":8080", Handler: mux}
go func() {
log.Println("server starting")
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}
}()
fmt.Println("server started")
<-quit
// gracefully stop server
ctx, cancel := context.WithTimeout(context.Background(), 60 * time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal(err)
}
log.Println("server stopped")
}
关于http.Server ListenAndServer 然后即时关机不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45256166/
在我的 root 用户 android 应用程序上,我使用 执行关机 su reboot -p 它工作正常,但我注意到手机几乎立即关机(而不是显示关机动画,并且可能在做其他事情)。 这是以编程方式关闭
我想创建一个流量小部件,并在每次设备关闭时存储使用的流量。问题是我无法触发关闭接收器。 我使用了以下代码: IntentFilter actionShutdown = new IntentFi
前言 RTC RTC 即实时时钟(Real-Time Clock),主要是功能有: 时间保持:RTC可以在断电的时候,仍然保持计时功能,保证时间的连续性 时间显示与设置:RTC可以向系
我在网上发现我可以安排 Windows 关闭: private void button1_Click(object sender, EventArgs e) { // Shutdown
是我可以调用的任何方法,它返回给我的信息是电话实际要关机(关机)。我知道这是 ACTION_SHUTDOWN 的 Intent ,但我必须从另一个来源获取有关关闭电话的信息。最好是直接形成系统。可能会
有没有办法在终止时运行代码,无论终止是什么类型(异常、正常、未捕获的异常等)?我知道它在 Java 中实际上是可能的,但它甚至可能在 C++ 中吗?我假设是 Windows 环境。 最佳答案 不——如
我希望我的应用程序可以防止 Windows 关闭。我知道有一个系统命令可以做到这一点。但不适用于我的程序。我使用此代码“取消”关闭的窗口: private void Form1_FormClosing
如何为我的应用暂停足够长的关机时间?我找到了一个 example ,但它适用于 Delphi - 我无法将其翻译成 C++。 最佳答案 这是 Delphi 代码的 C++Builder VCL 翻译:
我想知道当某个软件需要重新启动、关闭、注销或休眠 Windows 时,最佳做法是什么: 使用ExitWindowsEx API 使用关机命令及其参数 每种方法的优点和缺点是什么? 谢谢 最佳答案 我总
当我在虚拟机运行时尝试关闭 Windows 时,VMWare Workstation 的表现非常酷: 通常,我们会看到“此程序正在阻止 Windows 关闭”消息,而不是新的“1 个虚拟机正在使用中”
1、注销,关机,重启 注销系统的logout命令 1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost r
php 里面有个 system 方法, 可以调用系统命令。 先建立一个脚本(比喻 /root/reboot_server.sh ),重启用的。 复制代码代码如下: #!
我在戴尔 5000 游戏系列上安装了 Ubuntu 18.04,安装正常,然后在安装后提示重新启动。 重新启动登录屏幕后,我输入密码(为我在安装过程中创建的帐户)并按回车,但屏幕变为粉红色,几秒钟后它
我需要能够实现方法来防止这些情况发生: 关机 重启 注销 sleep 在 Mac 上,我使用的是 Xcode,但似乎无法找出执行这些操作的代码。 有人可以帮我从这里出去吗? 我发现了这个:http:/
我正在开发应用程序,我有一个要求:如果用户在任何时候长按电源按钮并再次按下以启动设备, Activity 应该从设备关闭的地方开始。我也不知道这个是不是一个有效的问题。我尝试使用: public cl
是否可以在所有网络接口(interface)停止之前检测到 Linux 中的系统关闭/重启?我可以处理 SIGTERM 信号并检查运行级别,但此时网络可能已经关闭。我需要 Python 脚本中的功能。
我目前正在开发一个小型但基本的应用程序,使用 tkinter 在我的 Windows 启动上运行,这样我就可以为我想要打开的不同内容提供一个小菜单。例如,我目前有启动我玩的一些游戏的按钮以及启动 Sk
我知道 shutdown -a 会中止 Windows 关机,但我需要知道是否有任何地方可以检查是否正在进行关机。 理想情况下,我想要一个像这样的小程序: import os while True
我试图在我的 c 程序中检测 Linux 的关闭或重启。我发现程序可以使用 signal(SIGTERM, handler) (SIGKILL, handler)。但是如果用户也使用命令终止进程,这两
我有这个工作的 Windows Server 2012 VM,需要重新启动。在我重新启动虚拟机后,更改了一些设置(连接了一个 DVD 驱动器),它会再次启动。 现在它说: Failed - The a
我是一名优秀的程序员,十分优秀!