本人2月份由于個人原因離開了深圳,也同樣離開了在深圳的公司,后來面試了好多家公司掀抹,基本都是已經(jīng)融資的虐拓,下面給小伙伴們分享一下心俗,我在這期間遇到的面試題,希望能給小伙伴在未來找工作或者學(xué)習(xí)中帶來一絲的幫助蓉驹。
1城榛,nginx與uwsgi是如何通信的?
我們知道态兴,nginx把瀏覽器等發(fā)過來的請求通過proxy_pass或者uwsgi_pass轉(zhuǎn)發(fā)給上游的web application進(jìn)行處理狠持,然后把處理的結(jié)果發(fā)送給瀏覽器。uwsgi_pass命令的處理函數(shù)為ngx_http_uwsgi_handler,也就是說瞻润,當(dāng)有請求到達(dá)配置uwsgi_pass的location時喘垂,會調(diào)用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;//根據(jù)wsgi協(xié)議創(chuàng)建請求包體
u->process_header = ngx_http_uwsgi_process_status_line;//根據(jù)wsgi協(xié)議解析uwsgi發(fā)送來的頭部
……
rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);//從瀏覽器讀取body數(shù)據(jù)
……
}
2正勒,nginx與uwsgi是多線程還是多進(jìn)程 ?
- uwsgi是用c語言寫的一個webserver,可以啟動多個進(jìn)程傻铣,進(jìn)程里面可以啟動多個線程來服務(wù)章贞。進(jìn)程分為主進(jìn)程和worker進(jìn)程,worker里面可以有多個線程非洲。
- Nginx會按需同時運行多個進(jìn)程:一個主進(jìn)程(master)和幾個工作進(jìn)程(worker)鸭限,配置了緩存時還會有緩存加載器進(jìn)程(cache loader)和緩存管理器進(jìn)程(cache manager)等蜕径。Nginx主要通過“共享內(nèi)存”的機(jī)制實現(xiàn)進(jìn)程間通信。主進(jìn)程以root用戶身份運行败京,而worker兜喻、cache loader和cache manager均應(yīng)以非特權(quán)用戶身份運行。
- 在工作方式上喧枷,Nginx分為單工作進(jìn)程和多工作進(jìn)程兩種模式虹统。在單工作進(jìn)程模式下,除主進(jìn)程外隧甚,還有一個工作進(jìn)程车荔,工作進(jìn)程是單線程的;在多工作進(jìn)程模式下戚扳,每個工作進(jìn)程包含多個線程忧便。Nginx默認(rèn)為單工作進(jìn)程模式。
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砍艾,監(jiān)控user-agent
2蒂教,監(jiān)控ip
3,登錄才能訪問
4脆荷,nginx的加密
7凝垛,請說一下線程與進(jìn)程的區(qū)別
- 進(jìn)程就是包換上下文切換的程序執(zhí)行時間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文
- 進(jìn)程和線程都是一個時間段的描述,是CPU工作時間段的描述蜓谋,不過是顆粒大小不同梦皮。
8,下面的程序 會是什么情況桃焕?答案會報參數(shù)錯誤剑肯。
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的區(qū)別?
POST
用于提交請求溃睹,可以更新或者創(chuàng)建資源,是非冪等的
舉個例子七兜,在我們的支付系統(tǒng)中丸凭,一個api的功能是創(chuàng)建收款金額二維碼,它和金額相關(guān),每個用戶可以有多個二維碼惜犀,如果連續(xù)調(diào)用則會創(chuàng)建新的二維碼铛碑,這個時候就用POST
PUT
用于向指定的URI傳送更新資源,是冪等的
還是那個例子虽界,用戶的賬戶二維碼只和用戶關(guān)聯(lián)汽烦,而且是一一對應(yīng)的關(guān)系,此時這個api就可以用PUT莉御,因為每次調(diào)用它撇吞,都將刷新用戶賬戶二維碼
10,http有幾種方式?
OPTIONS:返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性礁叔。
HEAD:向服務(wù)器索要與GET請求相一致的響應(yīng)牍颈,只不過響應(yīng)體將不會被返回。這一方法可以在不必傳輸整個響應(yīng)內(nèi)容的情況下琅关,就可以獲取包含在響應(yīng)消息頭中的元信息煮岁。
GET:向特定的資源發(fā)出請求。
POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)涣易。數(shù)據(jù)被包含在請求體中画机。POST請求可能會導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。
PUT:向指定資源位置上傳其最新內(nèi)容新症。
DELETE:請求服務(wù)器刪除Request-URI所標(biāo)識的資源步氏。
TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷徒爹。
CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器荚醒。
一次查詢1億數(shù)據(jù)應(yīng)該怎么優(yōu)化呢?
https://jingyan.baidu.com/article/e75057f2c413e8ebc91a89b0.html
以上答案都是本人課后查找的瀑焦,水平有限腌且,僅供參考梗肝,如果發(fā)現(xiàn)錯誤請及時聯(lián)系作者榛瓮,謝謝童谒!共同進(jìn)步M谘溅蛉!