我把在v2上發(fā)的帖子下面的評(píng)論摘抄下來
原帖:https://www.v2ex.com/t/593748#r_7793688
兩個(gè)說的比較詳細(xì)的回答:
回答1:
一個(gè)工廠(worker)有一個(gè)員工(單進(jìn)(線)程),為了提高效率漾脂,請(qǐng)多了幾個(gè)員工一起工作(單 worker 多進(jìn)程)
為了防止這個(gè)工廠斷電無法工作能颁,那么多建了幾個(gè)工廠,每個(gè)工廠有多個(gè)員工(多 worker 多進(jìn)程)
實(shí)際上都是在實(shí)現(xiàn)并發(fā)
單 worker 可以開 n 個(gè)進(jìn)程進(jìn)行工作旁涤,一個(gè) worker 掛了往往所有進(jìn)程都會(huì)掛掉
多 worker 假設(shè)為 m 個(gè),可以理解為分布式迫像,為了防止一個(gè) worker 掛了(或者性能不足等原因)劈愚,導(dǎo)致無法工作
那么能夠并發(fā)處理的任務(wù)數(shù)量理論上為 m * n
一般 worker(不僅 celery,很多設(shè)計(jì)都是這樣)指一個(gè)調(diào)度主進(jìn)程 + 多個(gè)子工作進(jìn)程
一個(gè) worker 有什么缺點(diǎn):
- 如果這個(gè) worker 的主進(jìn)程掛了,那么整個(gè)任務(wù)系統(tǒng)都崩了闻妓。
- 再往深點(diǎn)菌羽,如果你服務(wù)端 master 發(fā)送的任務(wù)速度很快,遠(yuǎn)大于 worker 主進(jìn)程去分發(fā)任務(wù)的速度由缆,可能會(huì)影響效率(但這種情況很少注祖,而且這種框架一般都是容忍延遲的)
- 部署 worker 這臺(tái)機(jī)器掛了,那么你的任務(wù)系統(tǒng)都崩了
- 這臺(tái)機(jī)器的資源(cpu均唉,內(nèi)存是晨,IO 等)無法滿足你的需求
比較常見的是在不同機(jī)器部署多個(gè) worker
在不考慮機(jī)器和進(jìn)程掛掉但情況,其實(shí)一個(gè) worker 開 8 個(gè)進(jìn)程和 2 個(gè) worker 每個(gè)開 4 個(gè)進(jìn)程的效率是接近的
回答2:
celery 里面的-c 參數(shù)指定的是并發(fā)度舔箭,而-P 參數(shù)指定并發(fā)的實(shí)現(xiàn)方式署鸡,有 prefork (default)、eventlet限嫌、gevent 等靴庆,prefork 就是多進(jìn)程的方式去實(shí)現(xiàn)并發(fā)。
你理解的多 worker 對(duì)應(yīng)到多個(gè)進(jìn)程怒医,每個(gè) worker (進(jìn)程)自己內(nèi)部還能并發(fā)是 gunicorn 的方式炉抒。gunicorn 的-w 參數(shù)指定有幾個(gè) worker (即幾個(gè)進(jìn)程),-k 參數(shù)指定每個(gè) worker 的并發(fā)方式稚叹,可以是多線程或者多協(xié)程焰薄,也可以指定為 sync拿诸,表示 worker 是同步的,即不能并發(fā)塞茅。
比如 gunicorn 的-w 10 -k sync 和 celery 的-c 10 -P prefork 是等價(jià)的亩码,都是創(chuàng)建 10 個(gè)進(jìn)程去做并發(fā),并發(fā)度最高就是 10野瘦。
再例如 celery 的-c 10 -P gevent 表示創(chuàng)建 10 個(gè) gevent 協(xié)程去做并發(fā)描沟,最高并發(fā)度也是 10。而 gunicorn 的-w 10 -k gevent鞭光,表示的是創(chuàng)建 10 個(gè)進(jìn)程吏廉,且每個(gè)進(jìn)程都是 gevent 異步的,這個(gè)并發(fā)度就很高了惰许。