最近一直在研究 py 的异步......
所以想把之前整的一个 P 站收藏夹的爬虫换成异步,但是想了想,貌似收藏夹翻页的部分好像整不了异步?..
(写的很乱.....😶)
爬虫大概是这样运行的:
返回的下一页的 url 貌似不固定,得从上一步的结果中取...,所以这步好像不能异步?...🤔
但是数据库存储数据这步好像可以异步执行,但是怎么操作.......(创建了异步任务后需要 await 任务,await 任务这步貌似是堵塞的)😢
不知道单用异步能不能解决这个问题...
所以我想再开一个线程,把存数据库的操作丢到另一个线程里去操作...
各位有什么想法么?.........还有 有关于 python asyncio 的教程推荐么..(中文的...)
1
ClericPy 2020-05-31 13:26:49 +08:00 1
前几天刚看到的...
Guide to Concurrency in Python with Asyncio ⋆ Mark McDonnell - https://www.integralist.co.uk/posts/python-asyncio/ 其他的搜索结果 https://www.clericpy.top/newspaper/articles.query.html?query=asyncio&date=&start_time=&end_time=&source=&lang=ANY&order_by=ts_create&sorting=desc&limit=10&offset= 只看四星以上结果吧, 这个过滤器当初忘了写... 过几天再补 然后, asyncio 用的时候和多线程有点像, 但是又很多区别, 官方如果能设计的像 gevent 那种就好了... 不吐槽了, 大致要看的就是 Future 的思想, 然后知道 asyncio.Task 是一个已经在执行的协程任务, 如果你的数据库操作库不支持协程, 就只能丢到一个 "线程 executor" 里面做一个协程包装(也就是丢给线程, 但可以被 await) 至于你说的从上一步结果里取, 那就是个串行关联了, 因为第二步可能也要用协程, 所以就尽量别用 add_done_callback, 做好 await 就行了 多数人用协程的时候很少会开多个线程然它单独跑一个事件循环, 因为一不小心通信过程会遇到 different loop thread 之类的 runtime error, 所以用 executor 包装下更省心 没代码也说不了太多了 |
2
renmu123 2020-05-31 13:37:13 +08:00 via Android
你可以获取全部资料后一口气存到数据库,没必要获取一次存一次
|
3
yuban10703 OP @renmu123 emm, api 的请求之间有 5s 左右的间隔,主要是想利用这些时间....
|
4
jugelizi 2020-05-31 14:07:46 +08:00
哈哈 这种一般我丢任务队列
一个任务去抓列表 存数据库 再推送队列 另外一个不断消费 |
5
yuban10703 OP @jugelizi 我去研究研究🤔
|
6
daimiaopeng 2020-05-31 15:59:08 +08:00
我用 cpp 写的多线程 http 库可以了解一下: https://github.com/daimiaopeng/fast_requests
|
7
yuban10703 OP @daimiaopeng (☆▽☆)
|
8
ruanimal 2020-05-31 17:27:34 +08:00
你想异步需要换库,requests 得换成对应的异步库,还有数据库相关的库也是,不然异步没啥意义
|
9
octobersnow 2020-05-31 21:58:31 +08:00 via Android
@daimiaopeng 最快在哪里?
|
10
black11black 2020-06-01 12:36:08 +08:00
建议老实先看一遍庞杂的 aysncio 文档,了解一下异步大概是什么,你这些问的都哪跟哪啊
|
11
coderunI 2020-06-01 15:49:23 +08:00
你需要 redis
|