网络-spider lab

爬虫实战 基础知识积累

MongoEngine v.s. PyMongo

  1. PyMongo 是较为低级 MongoDB 的 Python 驱动器, 封装了 MongoDB API, 并通过 JSON 与 MongoDB 通信, 将 MongoDB 的类型映射成 Python 的基本类型
  2. MongoEngine 相当于是在 PyMongo 上又封装了一层, 但是性能相差不大。其实是一个Document-Object Mapper (类似于ORM, Object Relationship Mapper,DOM是针对文档性数据库)。PyMongo是将MongoDB中的数据类型映射成Python的基础数据类型, 而MongoEngine是映射成自定义类。
  3. PyMongo 上, 人们可以获得更多的控制权, 但是对于一个大系统来说, MongoEngine更加合适

    reference

    [1] https://api.mongodb.com/python/current/tools.html [2] https://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB%E6%98%A0%E5%B0%84 [3] https://stackoverflow.com/questions/5712857/pymongo-vs-mongoengine-for-django

Gevent

协程,线程,进程

  1. 一个应用程序对应一个进程,一个进程一般有一个主线程以及若干个辅助线程。进程是系统进行资源分配和调度的一个独立单位。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 线程之间是相互平行的。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 在线程中间可以开启协程, 让程序在特定的时间内运行。协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
  2. But! 协程避免了无意义的调度,减少切换时浪费的时间,但程序员也因此承担起调度的责任,同时协程也失去了标准线程使用CPU的能力。

    Greelets

    在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

    函数

    gevent.spawn()会创建一个新的 Greenlet 协程对象并运行。 gevent.joinall()会等所有传入的 Greenlet 协程结束后再退出

猴子补丁 (monkey patching)

由于协程是非阻塞的,但是Python标准库中的socket是阻塞的,DNS解析无法并发,因此不解决这个问题协程将完全没有意义。 对于这个问题有两种解决方案:

Table of Contents