若是你只想成为一个初级工程师,是彻底没有必要研究任何框架或者语言自己的源码的。可是若是你想在IT领域有必定的成就,那源码学习是你一条必经之路。面试
我见过很多初级工程师,开发出来的程序逻辑上没有问题,可是性能低下。程序上线就承受巨大压力,甚至引起性能故障,严重影响我的业绩。redis
归根到底,仍是在底层原理上吃亏。无论学习什么技术,浅尝辄止确定是不行的。今天就经过一个实际的问题来给你们讲下查看源码的好处。编程
想必你们在写程序的时候,必定会报不少的错误,有些错误是逻辑上的问题,有些是传参类型的错误。还有一种就是我程序能够运行,可是又不知道为何能够运行。等等这类问题,其实都是能够经过查看框架或者语言自己的源码来解释的。设计模式
你们若是用过scrapy_redis的小伙伴,都知道我想完成分布式的爬虫,必定要在配置文件中设置Redis的链接。设置的方式有两种,以下面代码所示框架
REDIS_URL = "redis://127.0.0.1:6379" REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379
可是有没有小伙伴想过,若是不设置的话可不能够。抱着试一试的态度,来进行尝试。当我把爬虫运行起来以后,居然也把相应的键值保存进去了。不相信的小伙伴能够本身去试试。scrapy
这令我非常费解,因此我决定去看看scrapy_redis源码来一探究竟。socket
能够看到scrapy_redis的源码其实也并无太多,因此查看起来仍是比较方便的。从名字上也能大概猜到,connection.py是链接Redis的。分布式
connection.py文件,经过查看注释,大概能了解到这个函数的做用。经过get_client方法,并使用默认的参数来返回一个Redis客户端。ide
def get_redis_from_settings(settings): """Returns a redis client instance from given Scrapy settings object. This function uses ``get_client`` to instantiate the client and uses ``defaults.REDIS_PARAMS`` global as defaults values for the parameters. You can override them using the ``REDIS_PARAMS`` setting.
接下来去查看下get_client方法,这个方法作了一个判断,判断你是经过那种方式传的Redis配置。这其中有一个defaults.REDIS_CLS,这就是我们解开谜团的关键了。函数
def get_redis(**kwargs): """Returns a redis client instance. Parameters ---------- redis_cls : class, optional Defaults to ``redis.StrictRedis``. url : str, optional If given, ``redis_cls.from_url`` is used to instantiate the class. **kwargs Extra parameters to be passed to the ``redis_cls`` class. Returns ------- server Redis client instance. """ redis_cls = kwargs.pop('redis_cls', defaults.REDIS_CLS) url = kwargs.pop('url', None) if url: return redis_cls.from_url(url, **kwargs) else: return redis_cls(**kwargs)
经过查看defaults.py文件,能够找到REDIS_CLS。
REDIS_CLS = redis.StrictRedis
在去查看StrictRedis这个类。
StrictRedis = Redis
Redis类中的__init__方法,你们能够看到,其实就是用的本地的地址和端口,因此若是不写的话,scrapy_redis默认会链接本地的Redis。至此谜团就解开了。
def __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, socket_connect_timeout=None, socket_keepalive=None, socket_keepalive_options=None, connection_pool=None, unix_socket_path=None, encoding='utf-8', encoding_errors='strict', charset=None, errors=None, decode_responses=False, retry_on_timeout=False, ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs='required', ssl_ca_certs=None, ssl_check_hostname=False, max_connections=None, single_connection_client=False, health_check_interval=0, client_name=None, username=None):
相信你们看到这里,大概能明白了源码能够帮助咱们解决开发中或者学习中的一些疑问。那你们必定还会有疑问,我真的有必要花大量的时间去学习源码吗?或者说花大量时间去学习源码真的有必要吗?
我给你们总结了几点缘由,也欢迎你们来补充。
首先编程是个理工科的东西,咱们去看一些优秀框架的源码,去研究一些底层的原理,能够更好的帮助咱们理解。闭门造车是造不出好车的,一样天天只停留在CURD也不能提升你的编程能力,最可能是你的CURD愈来愈熟练。
第二点我以为大多数大厂,如今面试的时候愈来愈多的会问到底层,会问到源码,好比阿里面试就会问到不少源码的实现机制,以及你作过的项目。因此有时候为了面试不少人也会去学习源码,可是这种以面试为驱动的学习,每每达不到很好的效果,基本面试后就会扔到一边。
学习源码,咱们能获得什么?
既然咱们花费了那么多时间去学习源码,去研究源码?咱们的收益有多少,咱们究竟能获得多少回到回报呢?能够先确定的回答,固然有很大的回报。前面也说过,学习开源框架源码能帮助咱们解决项目遇到的bug,扩展咱们的项目需求
经过学习源码,学习开源大牛们是如何运用设计模式的,而后运用到咱们开发的项目中,使咱们的项目的模块更易于扩展;经过学习源码,咱们能编码更高效。为何呢?若是咱们对某个开源项目源码很熟悉,那么咱们就能够对这个项目的源码信手拈来应用到本身项目中,不是么?总之学习源码好处多多,这也是成为大牛们的必经之路吧,只有学习和借鉴别人优秀的做品,本身才能造出更优秀的做品。
最后送给你们一句话,你知道的越多,你不知道的就越多。