美文网首页
2018年3月Python面试总结

2018年3月Python面试总结

作者: __apple | 来源:发表于2018-03-20 22:19 被阅读0次

    本人2月份由于个人原因离开了深圳,也同样离开了在深圳的公司,后来面试了好多家公司,基本都是已经融资的,下面给小伙伴们分享一下,我在这期间遇到的面试题,希望能给小伙伴在未来找工作或者学习中带来一丝的帮助。

    1,nginx与uwsgi是如何通信的?

    我们知道,nginx把浏览器等发过来的请求通过proxy_pass或者uwsgi_pass转发给上游的web application进行处理,然后把处理的结果发送给浏览器。uwsgi_pass命令的处理函数为ngx_http_uwsgi_handler,也就是说,当有请求到达配置uwsgi_pass的location时,会调用ngx_http_uwsgi_handler方法,而该方法是整个uwsgi事件处理的入口方法。下面来看该方法:

    static ngx_int_t ngx_http_uwsgi_handler(ngx_http_request_t *r)
    {
        ngx_http_upstream_t *u;
        ngx_http_uwsgi_loc_conf_t   *uwcf;
        uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);
        u = r->upstream;
        ……
        u->create_request = ngx_http_uwsgi_create_request;//根据wsgi协议创建请求包体
        u->process_header = ngx_http_uwsgi_process_status_line;//根据wsgi协议解析uwsgi发送来的头部
        ……
        rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);//从浏览器读取body数据
        ……
    }
    

    2,nginx与uwsgi是多线程还是多进程 ?

    • uwsgi是用c语言写的一个webserver,可以启动多个进程,进程里面可以启动多个线程来服务。进程分为主进程和worker进程,worker里面可以有多个线程。
    • Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。Nginx主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。
    • 在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

    3,写一个连表查询

    select * from erp as o left join a as p on o.id = p.id where o.price > 20;
    

    4,用Django的ORM写一个连表查询

    Entry.objects.filter(blog__name='Beatles Blog')
    

    5,写一个单例模式

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, 'happle'):
                cls.happle = super(Singleton, cls).__new__(cls, *args,**kwargs)
            return cls.happle
    
    class SingleSpam(Singleton):
        def __init__(self,s):
            self.s = s
    
        def __str__(self):
            return self.s
    
    s1 = SingleSpam('spam')
    print id(s1) # 4487315984
    s2 = SingleSpam('spa')
    print id(s2) # 4487315984
    

    6,请你说出几种常见的反爬策略?

    1,监控user-agent

    2,监控ip

    3,登录才能访问

    4,nginx的加密

    7,请说一下线程与进程的区别

    • 进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文
    • 进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。

    8,下面的程序 会是什么情况?答案会报参数错误。

    class A(object):
        def run(self,a):
            return a
    
    class B(A):
        def run(self,a,b):
            return b
    
    B().run(1)
    

    django orm 常用查询筛选(自己新增)

    大于、大于等于

    __gt  大于
    __gte  大于等于
    
    User.objects.filter(age__gt=10)    // 查询年龄大于10岁的用户
    User.objects.filter(age__gte=10)  // 查询年龄大于等于10岁的用户
    

    小于、小于等于

    __lt  小于
    __lte 小于等于
    
    User.objects.filter(age__lt=10)     // 查询年龄小于10岁的用户
    User.objects.filter(age__lte=10)   // 查询年龄小于等于10岁的用户
    

    in

    __in
    
    查询年龄在某一范围的用户
    User.objects.filter(age__in=[10, 20, 30])
    

    like

    __exact        精确等于 like 'aaa'
    __iexact       精确等于 忽略大小写 ilike 'aaa'
    __contains     包含 like '%aaa%'
    __icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
    

    is null / is not null

    __isnull  判空
    
    User.objects.filter(username__isnull=True)    // 查询用户名为空的用户
    User.objects.filter(username__isnull=False)  // 查询用户名不为空的用户
    

    不等于/不包含于

    User.objects.filter().excute(age=10)    // 查询年龄不为10的用户
    User.objects.filter().excute(age__in=[10, 20])  // 查询年龄不为在 [10, 20] 的用户
    

    9,put与post的区别?

    POST
    用于提交请求,可以更新或者创建资源,是非幂等的
    举个例子,在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST


    PUT
    用于向指定的URI传送更新资源,是幂等的
    还是那个例子,用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次调用它,都将刷新用户账户二维码

    10,http有几种方式?

    OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

    HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

    GET:向特定的资源发出请求。

    POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

    PUT:向指定资源位置上传其最新内容。

    DELETE:请求服务器删除Request-URI所标识的资源。

    TRACE:回显服务器收到的请求,主要用于测试或诊断。

    CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

    一次查询1亿数据应该怎么优化呢?

    https://jingyan.baidu.com/article/e75057f2c413e8ebc91a89b0.html


    以上答案都是本人课后查找的,水平有限,仅供参考,如果发现错误请及时联系作者,谢谢!共同进步!!

    相关文章

      网友评论

          本文标题:2018年3月Python面试总结

          本文链接:https://www.haomeiwen.com/subject/yktbqftx.html