摘要:這是一道用來(lái)熟練的題目,給定個(gè),要求使用在限定并發(fā)數(shù)為的情況下完成請(qǐng)求。
這是一道用來(lái)熟練Promise的題目,給定N個(gè)URL,要求使用Promise在限定并發(fā)數(shù)為M(M < N) 的情況下完成請(qǐng)求。
class PromisePool { constructor(max, fn) { this.max = max; // 最大并發(fā)數(shù) this.fn = fn; // 自定義的請(qǐng)求函數(shù) this.pool = []; // 并發(fā)池 this.urls = []; // 剩余的請(qǐng)求地址 } start(urls) { this.urls = urls; // 先循環(huán)把并發(fā)池塞滿 while (this.pool.length < this.max) { let url = this.urls.shift(); this.setTask(url); } // 利用Promise.race 方法來(lái)獲得并發(fā)池中某任務(wù)完成的信號(hào) let race = Promise.race(this.pool); return this.run(race); } run(race) { race .then(res => { // 每當(dāng)并發(fā)池跑完一個(gè)任務(wù),就再塞入一個(gè)任務(wù) let url = this.urls.shift(); this.setTask(url); return this.run(Promise.race(this.pool)); }); } setTask(url) { if (!url) return; let task = this.fn(url); this.pool.push(task); // 將該任務(wù)推入pool并發(fā)池中 console.log(`x1B[43m ${url} 開(kāi)始,當(dāng)前并發(fā)數(shù):${this.pool.length}`); task.then(res => { // 請(qǐng)求結(jié)束后將該P(yáng)romise任務(wù)從并發(fā)池中移除 this.pool.splice(this.pool.indexOf(task), 1); console.log(`x1B[43m ${url} 結(jié)束,當(dāng)前并發(fā)數(shù):${this.pool.length}`); }); } } // test const URLS = [ "bytedance.com", "tencent.com", "alibaba.com", "microsoft.com", "apple.com", "hulu.com", "amazon.com" ]; // 自定義請(qǐng)求函數(shù) var requestFn = url => { return new Promise(resolve => { setTimeout(_ => { resolve(`任務(wù) ${url} 完成`); }, 1000*dur++) }).then(res => { console.log("外部邏輯 ", res); }) } const pool = new PromisePool(3, requestFn); // 并發(fā)數(shù)為3 pool.start(URLs);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106935.html
摘要:而爬蟲(chóng)一般用多線程來(lái)控制并發(fā),然而如果是爬蟲(chóng),由于其單線程無(wú)阻塞性質(zhì)以及事件循環(huán)機(jī)制,一般不用多線程來(lái)控制并發(fā)當(dāng)然也可以實(shí)現(xiàn)多線程,此處非重點(diǎn)不再多講,而是更加簡(jiǎn)便地直接在代碼層級(jí)上實(shí)現(xiàn)并發(fā)。下面我們用行代碼實(shí)現(xiàn)一個(gè)并發(fā)控制的函數(shù)。 前言 首發(fā)于 github blog 做過(guò)爬蟲(chóng)的都知道,要控制爬蟲(chóng)的請(qǐng)求并發(fā)量,其實(shí)也就是控制其爬取頻率,以免被封IP,還有的就是以此來(lái)控制爬蟲(chóng)應(yīng)用運(yùn)...
摘要:故事開(kāi)始了,小程序圖片合成真機(jī)測(cè)試時(shí),會(huì)報(bào)錯(cuò)。所以只能將異步并發(fā)改為同步阻塞式渲染。 showImg(https://segmentfault.com/img/remote/1460000013228074); 故事開(kāi)始了,小程序canvas圖片合成 真機(jī)測(cè)試時(shí),會(huì)報(bào)錯(cuò):getImageInfo failed 。也就是說(shuō),我這邊異步請(qǐng)求50張圖片,每張圖片都是通過(guò)getImageInf...
摘要:以上兩點(diǎn)同時(shí)滿足時(shí)則說(shuō)明服務(wù)處于高負(fù)載狀態(tài),則進(jìn)行自適應(yīng)降載。如果放行則返回,等待業(yè)務(wù)側(cè)執(zhí)行回調(diào)函數(shù)執(zhí)行指標(biāo)統(tǒng)計(jì)。當(dāng)前系統(tǒng)的最大并發(fā)數(shù)窗口單位時(shí)間內(nèi)的最大通過(guò)數(shù)量窗口單位時(shí)間內(nèi)的最小響應(yīng)時(shí)間。 為什么需要降載微服務(wù)集群中,調(diào)用鏈路錯(cuò)綜復(fù)雜,作為服務(wù)提供者需要有一種保護(hù)自己的機(jī)制,防止調(diào)用方無(wú)腦調(diào)用壓垮自己,保證...
摘要:成功爬取了拉鉤網(wǎng)上多個(gè)招聘崗位的具體信息后,數(shù)據(jù)可視化并得出分析結(jié)果如下從整體看,北上廣深杭這五個(gè)城市前端工程師招聘崗位,北京是遙遙領(lǐng)先,是深圳的兩倍,是廣州的三倍,其次到上海,深圳,杭州,廣州居末。 前前言 本文首發(fā)于 github blog 不想看爬蟲(chóng)過(guò)程只想看職位錢途數(shù)據(jù)分析請(qǐng)看這里:前端招聘崗位分析C++招聘崗位分析JAVA招聘崗位分析PHP招聘崗位分析Python招聘崗位分析...
閱讀 2404·2021-11-24 09:39
閱讀 3223·2021-10-09 09:53
閱讀 1130·2021-09-22 16:06
閱讀 4442·2021-09-02 10:18
閱讀 800·2021-08-23 09:42
閱讀 1761·2021-08-17 10:11
閱讀 2685·2019-08-30 13:02
閱讀 2121·2019-08-30 12:49