请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

如何退出

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

正在回答 回答被采纳积分+3

1回答

ccmouse 2021-11-27 15:34:07

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 钧一十一 #1
    老师因为我使用的是grpc的client-side stream来完成的分布式,发现grpc有很多坑,首先如果是在goroutine里循环调用send就会触发io.EOF,其次在发送完成后需要关闭连接,发现实现起来很困难
    回复 有任何疑惑可以回复我~ 2021-11-27 15:39:15
  • 提问者 钧一十一 #2
    我的想法是在scheduler设置waitgroup
    回复 有任何疑惑可以回复我~ 2021-11-28 23:13:28
  • ccmouse 回复 提问者 钧一十一 #3
    总体来说是使用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 20:54:03
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信