![671b0e62cf1e62ca02bf41a23e2066f6.png](https://i-blog.csdnimg.cn/blog_migrate/a5ecad24fbabc192f4074647383679e5.jpeg)
比起上两篇文章来说,这篇相对比较简单。
在实际中,经常需要创建后台运行的任务,用于定时更新或者其他事情。
例如,之前写过一些爬虫的文章,在存储到数据库时,可以考虑写成把要存储的数据再通过requests等,post到服务器的方式,让views.py的某个视图函数统一插入数据库。
这时,要避免爬取重复新闻,就可以通过判断url的方式,于是需要后台任务定时重新获取某个范围内(如两天内)的url存储到app['old_urls'],再在views.py的视图函数中每次插入时也添加到app['old_urls']。
只要思路清楚,上面这段话在看完这篇文章后应该能很容易的实现出来。
这篇文章只讲一个非常简单的例子,获取2000条最新的url:
定时更新只需要用while True就行了,然后sleep的时间间隔采用之前在config设定好的update_interval。
于是,应该在db.py中添加如下代码:
![f8184bb70ad9a5e57eee7d0a60878833.png](https://i-blog.csdnimg.cn/blog_migrate/7bf3f58b673bc75c2ebbd440e1a3caef.jpeg)
注意for循环中的解包写法,如果有疑惑,建议sql中多select一个id等字段,for _, url in来写看起来就很直观了。
最后把结果存储到app['old_urls']中。
再把这个任务添加到启动和清理的任务列表中:
![ffa40d2d992d1cb0919bb93401014ab7.png](https://i-blog.csdnimg.cn/blog_migrate/566ab53c315a23d41c53df51adf1cbe9.jpeg)
注意这里事件循环loop是app的属性。
清理需要先cancel,再等待。
最后,再在main.py中给app启动和关闭时的任务列表添加这些:
app.on_startup.append(start_background_tasks)
app.on_cleanup.append(cleanup_background_tasks)
这样,就创建好了后台任务。
在views.py中,通过request.app['old_urls']可以访问后台获取的url。
例如:
![4372938773da567d0d32429e6b6dbed6.png](https://i-blog.csdnimg.cn/blog_migrate/02ea261d811c2f2c4f0e62d52527c02d.jpeg)
运行python main.py后,在http://127.0.0.1/test可以看到结果中前100条url。
改写
上篇文章介绍了aiohttp怎么保证清理任务只在成功初始化时运行,我们的后台任务也可以这样改写:
![1864ca6dcd98f2d091a1e5a22d333802.png](https://i-blog.csdnimg.cn/blog_migrate/85976d3758c128731fbdd1e3d10982a0.jpeg)
于是,可以把刚刚添加的2行app.on_startup/app.on_cleanup代码删掉,再添加1行:
app.cleanup_ctx.append(background_tasks)
对比一下应该很容易就能写出来,如果有疑惑建议重看上一篇文章。
这篇文章的全部代码可以从https://github.com/lucays/toutiao/tree/master/17获取。
仍然要记得把conf.json中mysql配置的省略号换成自己mysql数据库的配置。