【问题标题】:What is correct way to close persistent connection?关闭持久连接的正确方法是什么?
【发布时间】:2015-06-23 16:19:20
【问题描述】:

我的情况是:连接到 Redis 的长时间运行的服务器。此服务器等待 SIGTERM 信号终止。终止我的应用程序后保证释放连接的正确方法是什么?

我知道 defer - 确实很棒,但不适用于持久连接,因为我不想为每个操作打开到 Redis 的连接。

谢谢!

【问题讨论】:

  • 当您的应用程序退出时,所有文件描述符都被操作系统关闭。如果您想在退出之前尝试处理某些事情,那么您可以使用 defer,但无法保证您的任何代码在应用程序终止时运行。

标签: go connection


【解决方案1】:

如果您想确保在退出前执行某些代码块,您仍然可以使用defer。不同之处在于它的范围。你的connection和defer语句的范围应该是一样的。我不知道您的应用程序是什么,但为了提供一个具体示例,您需要在命令行应用程序的主程序中推迟连接关闭,而不是在读写方法中。

您说“因为我不想为每个操作打开与 Redis 的连接”,但这只会在执行单个 IO 操作的某些方法的范围内延迟关闭时才会出现问题。如果您改为在单个操作(所有操作发生的地方)之上的范围内执行延迟,那么它会做您想要的;

init connection
defer connectionClose

begin execution of code that does db IO
block here if above is async
program is exiting, my defer is called here

编辑:正如 cmets 中所指出的,延迟语句的执行不能保证。我只是想明确一点,您可以在应用程序的顶层延迟关闭连接。

【讨论】:

  • 为了使事情复杂化,在 os.Exit 上不会调用 defer。当您想要刷新缓冲数据时,此问题也适用。
  • @ffk 也许,但我认为我的回答的总体思路仍然是正确的。虽然defer 可能无法涵盖 所有 关闭案例,但 OP 表示,如果他使用它,他将不得不为每个操作打开一个连接,但事实并非如此,这意味着他的 defer 正在在错误的范围内声明。这纯粹是我的推论,但我认为这是他面临的问题。不是“我如何用我的电脑写/清理字面上意外关闭”的问题。
  • 我同意,我主要想指出调用 os.Exit() 不会运行 defer(这是关闭应用程序的完全合理的方法,不像拔插头 :)
猜你喜欢
  • 2011-03-21
  • 2012-12-04
  • 2013-02-27
  • 2019-11-03
  • 2016-06-30
  • 2019-04-14
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多