在 Uber FX 中实现后台进程正常关闭的正确方法是什么?
在Uber FX中,实现后台进程正常关闭的正确方法是什么?这是许多人在使用Uber FX时经常遇到的问题。作为一款强大的后台任务处理框架,Uber FX提供了一种简单而有效的方法来管理和处理后台任务。php小编子墨将在本文中为您介绍如何正确关闭后台进程,确保程序的稳定性和正常运行。
问题内容
假设我的 Uber FX 应用程序中有一个服务,它应该执行一些后台活动,例如轮询外部 API。 我可以通过触发 goroutine 来运行后台任务,但是停止它们的正确方法是什么?
作为一种可能的实现,让我们考虑以下示例:
package main import ( "context" "log" "sync" "time" "go.uber.org/fx" ) type AwesomeService struct { // context to use for background processes bg context.Context // to trigger background processes stopping cancel context.CancelFunc // to wait for background processes to gracefully finish wg *sync.WaitGroup } func New(lc fx.Lifecycle) *AwesomeService { bg, cancel := context.WithCancel(context.Background()) service := &AwesomeService{ bg: bg, cancel: cancel, wg: new(sync.WaitGroup), } lc.Append(fx.Hook{ OnStart: service.start, OnStop: service.stop, }) return service } func (s *AwesomeService) start(_ context.Context) error { s.runBackgroundProcess() log.Println("Start done") return nil } func (s *AwesomeService) stop(_ context.Context) error { s.cancel() s.wg.Wait() log.Println("Stop done") return nil } // runBackgroundProcess does some work till context is done. func (s *AwesomeService) runBackgroundProcess() { s.wg.Add(1) go func() { defer s.wg.Done() for { select { case <-s.bg.Done(): return case <-time.After(1 * time.Second): log.Println("Working...") } } }() } func main() { fx.New( fx.Provide(New), fx.Invoke(func(*AwesomeService) {}), ).Run() }
一些注意事项:
- 该服务通过使用
fx.Lifecycle
挂钩连接到应用程序生命周期。 - 我无法依赖和使用
OnStart
/OnStop
方法中的上下文,因为它们是不同的上下文并且对应于启动/停止活动,而不是应用生命周期上下文。
疑虑和问题:
- 给出的示例在跟踪背景任务方面相当繁重。此外,将上下文存储在结构中是一种反模式。有什么办法可以简化吗?
- 如果没有资源可以释放,我是否应该等待完成 goroutine?
解决方法
在我看来,使用上下文就很好,但是您也可以通过通道向您想要的任何 Go 例程传达关闭信号。请参阅下面的示例代码。
是的,您还应该等待等待组计数返回零,然后再完全关闭应用程序。所以你首先要关闭通道,然后在等待组上等待。
package main import ( "context" "log" "sync" "time" "go.uber.org/fx" ) type AwesomeService struct { // channel to shutdown background processes shutdown chan struct{} // to wait for background processes to gracefully finish wg *sync.WaitGroup } func New(lc fx.Lifecycle) *AwesomeService { service := &AwesomeService{ shutdown: make(chan struct{}), wg: new(sync.WaitGroup), } lc.Append(fx.Hook{ OnStart: service.start, OnStop: service.stop, }) return service } func (s *AwesomeService) start(_ context.Context) error { s.runBackgroundProcess() log.Println("Start done") return nil } func (s *AwesomeService) stop(_ context.Context) error { close(s.shutdown) s.wg.Wait() log.Println("Stop done") return nil } // runBackgroundProcess does some work till context is done. func (s *AwesomeService) runBackgroundProcess() { s.wg.Add(1) go func() { defer s.wg.Done() for { select { case <-s.shutdown: return case <-time.After(1 * time.Second): log.Println("Working...") } } }() } func main() { fx.New( fx.Provide(New), fx.Invoke(func(*AwesomeService) {}), ).Run() }
以上是在 Uber FX 中实现后台进程正常关闭的正确方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...
