Heim Web-Frontend js-Tutorial Verwenden Sie async und enterproxy, um die Anzahl der Parallelitäten zu steuern

Verwenden Sie async und enterproxy, um die Anzahl der Parallelitäten zu steuern

Jan 03, 2018 am 09:06 AM
async 并发

Ich glaube, dass Parallelität jedem bekannt ist. In diesem Artikel werden Ihnen hauptsächlich die relevanten Informationen zur Verwendung von Async und Enterproxy zur Steuerung der Parallelität vorgestellt In Bezug auf den Lernwert können Freunde, die ihn benötigen, dem Herausgeber folgen, um gemeinsam zu lernen.

Sprechen wir über Parallelität und Parallelität

Parallelität bedeutet im Betriebssystem, dass mehrere Programme in einem Zeitraum zwischen Start, Ausführung und Beendigung laufen Derselbe Prozessor, auf dem Prozessor läuft jedoch jeweils nur ein Programm.

Parallelität ist etwas, das wir oft erwähnen. Unabhängig davon, ob es sich um einen Webserver oder eine App handelt, bezieht sich die Parallelität auf mehrere Programme in einem Zeitraum zwischen dem Start und der Ausführung Alle laufen auf demselben Prozessor, und zu jedem Zeitpunkt läuft nur ein Programm auf dem Prozessor. Bei vielen Websites ist die Anzahl gleichzeitiger Verbindungen begrenzt. Wenn Anfragen also zu schnell gesendet werden, ist der Rückgabewert leer oder es wird ein Fehler gemeldet. Darüber hinaus blockieren einige Websites möglicherweise Ihre IP-Adresse, weil Sie zu viele gleichzeitige Verbindungen senden und glauben, dass Sie böswillige Anfragen stellen.

Parallelität ist im Vergleich zur Parallelität möglicherweise etwas ungewohnt. Parallelität bezieht sich auf eine Gruppe von Programmen, die mit einer unabhängigen und asynchronen Geschwindigkeit ausgeführt werden, was nicht gleichbedeutend mit einer zeitlichen Überlappung ist (die gleichzeitig mit mehreren CPUs auftritt). Durch die Erhöhung der Anzahl der CPU-Kerne können Programme (Aufgaben) gleichzeitig ausgeführt werden. Richtig, Parallelität ermöglicht die gleichzeitige Ausführung von Multitasking

Verwenden Sie Enterproxy, um die Anzahl der Parallelitäten zu steuern

Enterproxy ist ein Tool, zu dem Pu Lingda beigetragen hat und das eine Art Ereignis mit sich bringt -basierte Programmierung. Änderungen im Denken, Verwendung des Ereignismechanismus zur Entkopplung komplexer Geschäftslogik, Lösung der Kritik an der Kopplung von Callback-Funktionen, Umwandlung seriellen Wartens in paralleles Warten, Verbesserung der Ausführungseffizienz in multiasynchronen Kollaborationsszenarien

Wie nutzen wir die Enterproxy-Kontrolle für die Anzahl der Parallelitäten? Wenn wir keinen Enterproxy und keine hausgemachten Zähler verwenden, greifen wir normalerweise zu drei Quellen:

Diese tiefe Verschachtelung, serielle Art

 var render = function (template, data) {
 _.template(template, data);
 };
$.get("template", function (template) {
 // something
 $.get("data", function (data) {
 // something
 $.get("l10n", function (l10n) {
 // something
 render(template, data, l10n);
 });
 });
});
Nach dem Login kopieren

Entfernen Sie diese tiefe Verschachtelung in der Vergangenheit. Auf herkömmliche Weise, Wir verwalten selbst einen Zähler

(function(){
 var count = 0;
 var result = {};
 
 $.get('template',function(data){
 result.data1 = data;
 count++;
 handle();
 })
 $.get('data',function(data){
 result.data2 = data;
 count++;
 handle();
 })
 $.get('l10n',function(data){
 result.data3 = data;
 count++;
 handle();
 })

 function handle(){
 if(count === 3){
  var html = fuck(result.data1,result.data2,result.data3);
  render(html);
 }
 }
})();
Nach dem Login kopieren

Hier kann enterproxy die Rolle dieses Zählers übernehmen. Es hilft Ihnen zu verwalten, ob diese asynchronen Vorgänge abgeschlossen sind. Ruft automatisch die von Ihnen bereitgestellte Verarbeitungsfunktion auf Übergeben Sie die erfassten Daten als Parameter

var ep = new enterproxy();
ep.all('data_event1','data_event2','data_event3',function(data1,data2,data3){
 var html = fuck(data1,data2,data3);
 render(html);
})

$.get('http:example1',function(data){
 ep.emit('data_event1',data);
})

$.get('http:example2',function(data){
 ep.emit('data_event2',data);
})

$.get('http:example3',function(data){
 ep.emit('data_event3',data);
})
Nach dem Login kopieren

Enterproxy stellt auch APIs bereit, die für viele andere Szenarien erforderlich sind. Sie können diese API-Enterproxy selbst erlernen

Verwenden Sie Async, um die Anzahl der Parallelität zu steuern

Wenn wir 40 Anfragen stellen müssen, kann es sein, dass viele Websites zu viele gleichzeitige Verbindungen herstellen. Wenn Sie eine böswillige Anfrage stellen, wird Ihre IP blockiert.
Wir müssen also immer die Anzahl der Parallelitäten kontrollieren und dann diese 40 Links langsam crawlen.

Verwenden Sie mapLimit asynchron, um die Anzahl der gleichzeitigen Parallelität auf 5 zu steuern und jeweils nur 5 Links zu erfassen.

 async.mapLimit(arr, 5, function (url, callback) {
 // something
 }, function (error, result) {
 console.log("result: ")
 console.log(result);
 })
Nach dem Login kopieren

Wir sollten zunächst wissen, was Parallelität ist, warum wir die Anzahl der Parallelitäten begrenzen müssen und welche Lösungen verfügbar sind. Anschließend können Sie in der Dokumentation nachlesen, wie Sie die API verwenden. Die asynchrone Dokumentation ist eine großartige Möglichkeit, diese Syntaxen zu erlernen.

Simulieren Sie einen Datensatz. Die hier zurückgegebenen Daten sind falsch und die Rückgabeverzögerung ist zufällig.

var concurreyCount = 0;
var fetchUrl = function(url,callback){
 // delay 的值在 2000 以内,是个随机的整数 模拟延时
 var delay = parseInt((Math.random()* 10000000) % 2000,10);
 concurreyCount++;
 console.log('现在并发数是 ' , concurreyCount , ' 正在抓取的是' , url , ' 耗时' + delay + '毫秒');
 setTimeout(function(){
 concurreyCount--;
 callback(null,url + ' html content');
 },delay);
}

var urls = [];
for(var i = 0;i<30;i++){
 urls.push('http://datasource_' + i)
}
Nach dem Login kopieren

Dann verwenden wir async.mapLimit, um gleichzeitig zu crawlen und die Ergebnisse zu erhalten.

async.mapLimit(urls,5,function(url,callback){
 fetchUrl(url,callbcak);
},function(err,result){
 console.log('result: ');
 console.log(result);
})
Nach dem Login kopieren

Die Simulation ist ein Auszug aus Alsotang

Nachdem die Ausgabe ausgeführt wurde, werden die folgenden Ergebnisse erhalten

Wir haben festgestellt, dass die Die Anzahl der Parallelitäten erhöht sich von 1, aber wenn sie auf 5 ansteigt, hört sie auf zu wachsen. Wenn Aufgaben vorhanden sind, wird der Crawl fortgesetzt, und die Anzahl gleichzeitiger Verbindungen wird immer auf 5 gesteuert.

Vervollständigen Sie das Knoten-Einfach-Crawler-System

Da die Anzahl der von Eventproxy gesteuerten Parallelität im Tutorial-Beispiel „Knoten umfasst Lehren, aber keine Besprechungen“ von Alsotang Senior verwendet wird, werden wir dies tun Schließen Sie ein Projekt mit async ab. Ein einfacher Crawler, der die Anzahl gleichzeitiger Knoten steuert.

Ziel des Crawlings ist die Homepage dieser Website (manueller Gesichtsschutz)

Im ersten Schritt müssen wir folgende Module verwenden:

  • URL: wird für die URL-Analyse verwendet, hier wird url.resolve() verwendet, um einen legalen Domänennamen zu generieren

  • async: ein praktisches Modul, das leistungsstarke Funktionen und asynchrone JavaScript-Arbeit bereitstellt

  • Cheerio: eine schnelle, flexible JQuery-Kernimplementierung, die speziell für den Server angepasst wurde

  • Superagent: eine sehr praktische Client-Anfrage im NodeJS-Agentenmodul

Abhängige Module über npm installieren


Der zweite Schritt besteht darin, abhängige Module über „require“ einzuführen, um die Crawling-Objekt-URL zu bestimmen:

var url = require("url");
var async = require("async");
var cheerio = require("cheerio");
var superagent = require("superagent");
var baseUrl = 'http://www.chenqaq.com';
Nach dem Login kopieren

Schritt 3: Verwenden Sie Superagent, um die Ziel-URL anzufordern, und verwenden Sie Cheerio, um baseUrl zu verarbeiten, um die Zielinhalts-URL zu erhalten, und speichern Sie sie im Array arr

superagent.get(baseUrl)
 .end(function (err, res) {
 if (err) {
  return console.error(err);
 }
 var arr = [];
 var $ = cheerio.load(res.text);
 // 下面和jQuery操作是一样一样的..
 $(".post-list .post-title-link").each(function (idx, element) {
  $element = $(element);
  var _url = url.resolve(baseUrl, $element.attr("href"));
  arr.push(_url);
 });
 // 验证得到的所有文章链接集合
 output(arr);
 // 第四步:接下来遍历arr,解析每一个页面需要的信息
})
Nach dem Login kopieren

Wir brauchen a Die Funktion überprüft das erfasste URL-Objekt. Es ist sehr einfach, arr zu durchlaufen und auszudrucken:

function output(arr){
 for(var i = 0;i<arr.length;i++){
  console.log(arr[i]);
 }
}
Nach dem Login kopieren

Schritt 4: Wir müssen das erhaltene URL-Objekt durchlaufen und analysieren erforderliche Informationen für jede Seite.

这里就需要用到async控制并发数量,如果你上一步获取了一个庞大的arr数组,有多个url需要请求,如果同时发出多个请求,一些网站就可能会把你的行为当做恶意请求而封掉你的ip

async.mapLimit(arr,3,function(url,callback){
 superagent.get(url)
  .end(function(err,mes){
   if(err){
    console.error(err);
    console.log('message info ' + JSON.stringify(mes));
   }
   console.log('「fetch」' + url + ' successful!');
   var $ = cheerio.load(mes.text);
   var jsonData = {
    title:$('.post-card-title').text().trim(),
    href: url,
   };
   callback(null,jsonData);
  },function(error,results){
   console.log('results ');
   console.log(results);
  })
 })
Nach dem Login kopieren

得到上一步保存url地址的数组arr,限制最大并发数量为3,然后用一个回调函数处理 「该回调函数比较特殊,在iteratee方法中一定要调用该回调函数,有三种方式」

  • callback(null) 调用成功

  • callback(null,data) 调用成功,并且返回数据data追加到results

  • callback(data) 调用失败,不会再继续循环,直接到最后的callback

好了,到这里我们的node简易的小爬虫就完成了,来看看效果吧

嗨呀,首页数据好少,但是成功了呢。

参考资料

Node.js 包教不包会 - alsotang

enterproxy

async

async Documentation

相关推荐:

如何设置apache的并发数量_PHP教程

如何设置apache的并发数量

PHP通过加锁实现并发抢购功能

Das obige ist der detaillierte Inhalt vonVerwenden Sie async und enterproxy, um die Anzahl der Parallelitäten zu steuern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie können Parallelität und Multithreading von Java-Funktionen die Leistung verbessern? Wie können Parallelität und Multithreading von Java-Funktionen die Leistung verbessern? Apr 26, 2024 pm 04:15 PM

Parallelitäts- und Multithreading-Techniken mithilfe von Java-Funktionen können die Anwendungsleistung verbessern, einschließlich der folgenden Schritte: Parallelitäts- und Multithreading-Konzepte verstehen. Nutzen Sie die Parallelitäts- und Multithreading-Bibliotheken von Java wie ExecutorService und Callable. Üben Sie Fälle wie die Multithread-Matrixmultiplikation, um die Ausführungszeit erheblich zu verkürzen. Genießen Sie die Vorteile einer erhöhten Reaktionsgeschwindigkeit der Anwendung und einer optimierten Verarbeitungseffizienz durch Parallelität und Multithreading.

Anwendung von Parallelität und Coroutinen im Golang-API-Design Anwendung von Parallelität und Coroutinen im Golang-API-Design May 07, 2024 pm 06:51 PM

Parallelität und Coroutinen werden im GoAPI-Design für Folgendes verwendet: Hochleistungsverarbeitung: Mehrere Anfragen gleichzeitig verarbeiten, um die Leistung zu verbessern. Asynchrone Verarbeitung: Verwenden Sie Coroutinen, um Aufgaben (z. B. das Senden von E-Mails) asynchron zu verarbeiten und den Hauptthread freizugeben. Stream-Verarbeitung: Verwenden Sie Coroutinen, um Datenströme (z. B. Datenbanklesevorgänge) effizient zu verarbeiten.

Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen May 03, 2024 am 10:54 AM

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Wie verarbeitet die Java-Datenbankverbindung Transaktionen und Parallelität? Wie verarbeitet die Java-Datenbankverbindung Transaktionen und Parallelität? Apr 16, 2024 am 11:42 AM

Transaktionen gewährleisten die Integrität der Datenbankdaten, einschließlich Atomizität, Konsistenz, Isolation und Haltbarkeit. JDBC verwendet die Verbindungsschnittstelle, um die Transaktionssteuerung bereitzustellen (setAutoCommit, Commit, Rollback). Parallelitätskontrollmechanismen koordinieren gleichzeitige Vorgänge mithilfe von Sperren oder optimistischer/pessimistischer Parallelitätskontrolle, um eine Transaktionsisolation zu erreichen und Dateninkonsistenzen zu verhindern.

Was sind die am häufigsten verwendeten Parallelitätstools in Java-Funktionsbibliotheken? Was sind die am häufigsten verwendeten Parallelitätstools in Java-Funktionsbibliotheken? Apr 30, 2024 pm 01:39 PM

Die Java-Parallelitätsbibliothek bietet eine Vielzahl von Tools, darunter: Thread-Pool: Wird zum Verwalten von Threads und zur Verbesserung der Effizienz verwendet. Sperre: Wird zum Synchronisieren des Zugriffs auf gemeinsam genutzte Ressourcen verwendet. Barriere: Wird verwendet, um darauf zu warten, dass alle Threads einen bestimmten Punkt erreichen. Atomare Operationen: unteilbare Einheiten, die die Thread-Sicherheit gewährleisten. Gleichzeitige Warteschlange: Eine Thread-sichere Warteschlange, die den gleichzeitigen Betrieb mehrerer Threads ermöglicht.

Lösen von Parallelitätsproblemen in PHP-Multithread-Funktionen Lösen von Parallelitätsproblemen in PHP-Multithread-Funktionen May 01, 2024 pm 09:45 PM

Parallelitätsprobleme in PHP-Multithread-Funktionen können durch die Verwendung von Synchronisierungstools (z. B. Mutex-Sperren) gelöst werden, um den Multithread-Zugriff auf gemeinsam genutzte Ressourcen zu verwalten. Verwenden Sie Funktionen, die gegenseitige Ausschlussoptionen unterstützen, um sicherzustellen, dass die Funktion nicht erneut aufgerufen wird, während ein anderer Thread ausgeführt wird. Wickeln Sie nicht wiedereintrittsfähige Funktionen in synchronisierte Blöcke ein, um Funktionsaufrufe zu schützen.

Wie verwende ich atomare Klassen in der Parallelität und im Multithreading von Java-Funktionen? Wie verwende ich atomare Klassen in der Parallelität und im Multithreading von Java-Funktionen? Apr 28, 2024 pm 04:12 PM

Atomare Klassen sind threadsichere Klassen in Java, die unterbrechungsfreie Vorgänge ermöglichen und für die Gewährleistung der Datenintegrität in gleichzeitigen Umgebungen von entscheidender Bedeutung sind. Java stellt die folgenden atomaren Klassen bereit: AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Diese Klassen stellen Methoden zum Abrufen, Festlegen und Vergleichen von Werten bereit, um sicherzustellen, dass der Vorgang atomar ist und nicht durch Threads unterbrochen wird. Atomare Klassen sind nützlich, wenn Sie mit gemeinsam genutzten Daten arbeiten und Datenbeschädigungen verhindern, z. B. bei der Verwaltung gemeinsam genutzter Zähler für den gleichzeitigen Zugriff.

Wie vermeide ich Deadlocks durch Parallelität und Multithreading in Java-Funktionen? Wie vermeide ich Deadlocks durch Parallelität und Multithreading in Java-Funktionen? Apr 26, 2024 pm 06:09 PM

Deadlock-Probleme in Multithread-Umgebungen können verhindert werden, indem eine feste Sperrreihenfolge definiert und Sperren nacheinander erworben werden. Legen Sie einen Timeout-Mechanismus fest, um das Warten abzubrechen, wenn die Sperre nicht innerhalb der angegebenen Zeit erhalten werden kann. Verwenden Sie den Deadlock-Erkennungsalgorithmus, um den Thread-Deadlock-Status zu erkennen und Wiederherstellungsmaßnahmen zu ergreifen. In der Praxis definiert das Ressourcenverwaltungssystem eine globale Sperrreihenfolge für alle Ressourcen und zwingt Threads, die erforderlichen Sperren zu erwerben, um Deadlocks zu vermeiden.

See all articles