dask.LocalCluster參數(shù)解析
n_workers:節(jié)點(diǎn)數(shù)量,默認(rèn)是None
threads_per_worker:節(jié)點(diǎn)線程數(shù),默認(rèn)是None
processes:是否開進(jìn)程并發(fā),默認(rèn)是True
? ? dask的源碼是這樣的:
????然后我們看看n_wokers和threads_per_worker的處理邏輯:
? ? nprocesses_nthreads的源碼:
????CPU_COUNT的源碼:
????所以實(shí)際上你不用可以設(shè)置n_workers和threads_per_worker,它會(huì)自動(dòng)利用到你所有的cpu核心線程數(shù)并且自動(dòng)分配,比如六核十二線程的cpu,cpu_count = 12,它會(huì)分配成n_workers = 4 / threads_per_workers = 3。
????但你需要注意的是,這樣的分配是一定不會(huì)把cpu性能跑滿的,因?yàn)楸举|(zhì)上對(duì)于12線程的cpu,如果希望它們同時(shí)并發(fā)地工作,能真正并發(fā)的最大進(jìn)程數(shù)量就是12,所以只有當(dāng)n_workers = 12的情況下,理論上你的cpu負(fù)載才可能達(dá)到100%。n_workers = 4?/?threads_per_workers = 3本質(zhì)上是4個(gè)節(jié)點(diǎn)使用進(jìn)程,每個(gè)節(jié)點(diǎn)進(jìn)程下開3個(gè)線程,線程之間是競爭同一個(gè)進(jìn)程資源的。所以理論上假設(shè)你空閑時(shí)候的cpu占用是10%,那么你最高的cpu占用只能達(dá)到 10% + (4 / 12) = 43.3%?,你的并發(fā)也會(huì)更慢。
????所以實(shí)際上如果你希望你的cpu滿載,那么n_workers = cpu_count,也就是cpu線程數(shù),而threads_per_worker就設(shè)為1,多于1我認(rèn)為是沒有意義的,它們競爭的是同一個(gè)進(jìn)程的資源,況且python還有GIL。以下是我的項(xiàng)目代碼在不同n_workers和threads_per_worker下的運(yùn)行速度(六核十二線程):
????當(dāng)然更少的n_workers意味著在固定內(nèi)存大小的情況下,每個(gè)節(jié)點(diǎn)的工作內(nèi)存會(huì)更大,更大的工作內(nèi)存能夠避免dask在工作過程中出現(xiàn)memory leak的warning。
memory_limit:單個(gè)節(jié)點(diǎn)內(nèi)存限制,
????不設(shè)就自適應(yīng),默認(rèn)把你剩下能用的內(nèi)存平均劈給每一個(gè)節(jié)點(diǎn)
????None或者0就不設(shè)限,能直接給你內(nèi)存擠爆
scheduler_port: 調(diào)度器的監(jiān)聽端口
????默認(rèn)是0,就是隨機(jī)選端口
????本質(zhì)上它在哪個(gè)端口不重要,因?yàn)槲覀冎缓蚫ashboard交互
silence_logs:日志等級(jí),默認(rèn)是logging.WARN
????所以當(dāng)你不知道怎么debug dask報(bào)出來的各種各樣的warning時(shí),你就把它調(diào)高,看不見就等于沒有
host:調(diào)度器監(jiān)聽的主機(jī)名,默認(rèn)是localhost
? ? 本地集群下就不用管,調(diào)度器就在本機(jī)
ip:deprecated
dashboard_address:可視化界面地址
????模式是本機(jī)下的8787端口
worker_dashboard_address:可視化界面下的worker界面的地址
????默認(rèn)禁用了該功能,因?yàn)楸举|(zhì)上主界面就可以點(diǎn)到worker界面
????當(dāng)然一般情況下我們就看主界面就行
????worker界面會(huì)詳細(xì)顯示每個(gè)節(jié)點(diǎn)的資源狀況,一般情況不看那么細(xì)
diagnostics_port:deprecated
asynchronous:是否涉及異步
????也就是當(dāng)你的并發(fā)操作是異步函數(shù)的時(shí)候,需要把它設(shè)為True
????其他情況下最好保持是False
worker_class:節(jié)點(diǎn)類
????本質(zhì)上它就是個(gè)pipe line,你可以重寫里面的get_data和compute方法來實(shí)現(xiàn)一些管道方法,比如數(shù)據(jù)預(yù)處理、結(jié)果存儲(chǔ)
????不過一般我們還是把邏輯寫在外部,可讀性會(huì)高一點(diǎn)
????在使用進(jìn)程作為節(jié)點(diǎn)的情況下,重寫的父類叫做Nanny,否則重寫的父類叫Worker