共计 2919 个字符,预计需要花费 8 分钟才能阅读完成。
如果你只想成为一个高级工程师,是齐全没有必要钻研任何框架或者语言自身的源码的。然而如果你想在 IT 畛域有肯定的成就,那源码学习是你一条必经之路。
我见过不少高级工程师,开发进去的程序逻辑上没有问题,然而性能低下。程序上线就接受微小压力,甚至引发性能故障,重大影响集体业绩。
归根到底,还是在底层原理上吃亏。不论学习什么技术,浅尝辄止必定是不行的。明天就通过一个理论的问题来给大家讲下查看源码的益处。
想必大家在写程序的时候,肯定会报很多的谬误,有些谬误是逻辑上的问题,有些是传参类型的谬误。还有一种就是我程序能够运行,然而又不晓得为什么能够运行。等等这类问题,其实都是能够通过查看框架或者语言自身的源码来解释的。
大家如果用过 scrapy_redis 的小伙伴,都晓得我想实现分布式的爬虫,肯定要在配置文件中设置 Redis 的连贯。设置的形式有两种,如上面代码所示
REDIS_URL = "redis://127.0.0.1:6379"
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
然而有没有小伙伴想过,如果不设置的话可不可以。抱着试一试的态度,来进行尝试。当我把爬虫运行起来之后,居然也把相应的键值保留进去了。不置信的小伙伴能够本人去试试。
这令我很是费解,所以我决定去看看 scrapy_redis 源码来一探到底。
能够看到 scrapy_redis 的源码其实也并没有太多,所以查看起来还是比拟不便的。从名字上也能大略猜到,connection.py 是连贯 Redis 的。
connection.py 文件,通过查看正文,大略能理解到这个函数的作用。通过 get_client 办法,并应用默认的参数来返回一个 Redis 客户端。
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,扩大咱们的我的项目需要
通过学习源码,学习开源大牛们是如何使用设计模式的,而后使用到咱们开发的我的项目中,使咱们的我的项目的模块更易于扩大;通过学习源码,咱们能编码更高效。为什么呢?如果咱们对某个开源我的项目源码很相熟,那么咱们就能够对这个我的项目的源码信手拈来利用到本人我的项目中,不是么?总之学习源码好处多多,这也是成为大牛们的必经之路吧,只有学习和借鉴他人优良的作品,本人能力造出更优良的作品。
最初送给大家一句话,你晓得的越多,你不晓得的就越多。