如何退出

来源:18-10 实战项目总结

钧一十一

2021-11-24

做完了项目,但是发现在engine这里是for{},没有退出机制,如何在爬完数据后优雅的退出

写回答

1回答

ccmouse

2021-11-27

在SimpleEngine里面这比较容易,判断不再有新的request生成就行,不过ConcurrentEngine就比较困难了,因为engine不知道worker到底有没有完成它的工作。当然,要实现退出机制也是可以的,有许多方法但没有特别“完美”的方案,同学不妨思考一下有哪些方法可以实现退出。

另一种比较常用的方法是设置一个由外界触发的开关,一旦触发就优雅的停止服务,而不是说在数据爬完之后才退出。这是一个常见的需求,通常我们服务器线上版本更新就要实现这样优雅的退出。这反而比较容易,外界的触发可以是一个特殊的url网址,也可以捕获ctrl+c等。我们就在engine的for循环里,通过select侦测这个开关,如果触发了就不再给各worker发送新的request即可。

0
3
ccmouse
回复
钧一十一
总体来说是使用https://coding.imooc.com/lesson/180.html#mid=41987 并发任务控制中的有关done channel。是具体的grpc服务的话,我们还可以使用context。https://zhuanlan.zhihu.com/p/110085652 context里有一个cancel函数,其实就是对done channel的封装,可以使用context.WithCancel来试一下。 大方向是这样,但具体的话还需要针对具体问题来看。
2021-11-29
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程