Maison interface Web js tutoriel Utilisez async et enterproxy pour contrôler le nombre de simultanéités

Utilisez async et enterproxy pour contrôler le nombre de simultanéités

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

Je pense que la concurrence est familière à tout le monde.Cet article vous présente principalement les informations pertinentes sur l'utilisation d'async et d'enterproxy pour contrôler le nombre de concurrence.L'article le présente en détail à travers un exemple de code, ce qui est d'une certaine importance pour tout le monde. étudier ou travailler En se référant à la valeur de l'apprentissage, les amis dans le besoin peuvent suivre l'éditeur pour apprendre ensemble.

Parlons de concurrence et de parallélisme

La concurrence, dans le système d'exploitation, signifie que plusieurs programmes se trouvent dans une période de temps entre le démarrage, l'exécution et la fin. le même processeur, mais un seul programme est exécuté sur le processeur à la fois.

La concurrence est quelque chose que nous mentionnons souvent. Qu'il s'agisse d'un serveur Web ou d'une application, la concurrence est partout dans le système d'exploitation, elle fait référence à plusieurs programmes dans un laps de temps entre le démarrage et l'exécution, et ces programmes. tous fonctionnent sur le même processeur et un seul programme s'exécute sur le processeur à tout moment. De nombreux sites Web imposent des limites au nombre de connexions simultanées. Ainsi, lorsque les requêtes sont envoyées trop rapidement, la valeur de retour sera vide ou une erreur sera signalée. De plus, certains sites Web peuvent bloquer votre IP car vous envoyez trop de connexions simultanées et pensez que vous faites des requêtes malveillantes.

Comparé à la concurrence, le parallélisme peut être très inconnu. Le parallélisme fait référence à un groupe de programmes s'exécutant à une vitesse indépendante et asynchrone, qui n'est pas égale au chevauchement dans le temps (se produisant au même moment). Les cœurs peuvent être implémentés en augmentant le nombre de cœurs de processeur. Les programmes (tâches) sont exécutés simultanément. C'est vrai, le parallélisme permet d'effectuer plusieurs tâches simultanément

Utiliser enterproxy pour contrôler le nombre de simultanéités

Enterproxy est un outil auquel Pu Lingda a contribué, apportant une sorte d'événement -programmation basée sur des changements de pensée, en utilisant le mécanisme d'événements pour découpler une logique métier complexe, en résolvant les critiques du couplage des fonctions de rappel, en transformant l'attente série en attente parallèle, en améliorant l'efficacité d'exécution dans des scénarios de collaboration multi-asynchrones

Comment utilisons-nous le contrôle enterproxy Nombre de simultanéités ? Habituellement, si nous n'utilisons pas enterproxy et les compteurs faits maison, nous récupérons trois sources :

Cette imbrication profonde, de manière sérielle

 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);
 });
 });
});
Copier après la connexion

Supprimer cette imbrication profonde dans le passé De manière conventionnelle, nous maintenons un compteur par nous-mêmes

(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);
 }
 }
})();
Copier après la connexion

Ici, enterproxy peut jouer le rôle de ce compteur. Il vous aide à gérer si ces opérations asynchrones sont terminées, il appellera automatiquement la fonction de traitement que vous avez fournie et. transmettre les données capturées en tant que paramètres

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);
})
Copier après la connexion

enterproxy fournit également les API requises pour de nombreux autres scénarios. Vous pouvez apprendre cette API enterproxy par vous-même

Utiliser async pour contrôler le nombre de concurrence
.

Si nous avons 40 requêtes à faire, de nombreux sites Web peuvent vous amener à émettre trop de connexions simultanées. Lorsque vous faites une requête malveillante, votre IP est bloquée.
Nous devons donc toujours contrôler le nombre de concurrence, puis explorer lentement ces 40 liens.

Utilisez mapLimit en asynchrone pour contrôler le nombre de concurrence unique à 5 et ne capturer que 5 liens à la fois.

 async.mapLimit(arr, 5, function (url, callback) {
 // something
 }, function (error, result) {
 console.log("result: ")
 console.log(result);
 })
Copier après la connexion

Nous devons d'abord savoir ce qu'est la simultanéité, pourquoi nous devons limiter le nombre de simultanéités et quelles solutions sont disponibles. Ensuite, vous pouvez accéder à la documentation pour voir comment utiliser l'API. La documentation asynchrone est un excellent moyen d'apprendre ces syntaxes.

Simulez un ensemble de données. Les données renvoyées ici sont fausses et le délai de retour est aléatoire.

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)
}
Copier après la connexion

Ensuite, nous utilisons async.mapLimit pour explorer simultanément et obtenir les résultats.

async.mapLimit(urls,5,function(url,callback){
 fetchUrl(url,callbcak);
},function(err,result){
 console.log('result: ');
 console.log(result);
})
Copier après la connexion

La simulation est extraite de Alsotang

Après avoir exécuté la sortie, les résultats suivants sont obtenus

Nous avons constaté que le le nombre de concurrence passe de 1, mais lorsqu'il atteint 5, il cesse d'augmenter. Lorsqu'il y a des tâches, continuez à explorer et le nombre de connexions simultanées est toujours contrôlé à 5.

Complétez le système d'exploration simple du nœud

Étant donné que le nombre de concurrences contrôlées par eventproxy est contrôlé par l'exemple du didacticiel senior d'alsotang "Le nœud inclut l'enseignement mais pas la réunion", nous terminerons un projet using async Un robot d'exploration simple qui contrôle le nombre de nœuds simultanés.

La cible du crawl est la page d'accueil de ce site Web (protection manuelle du visage)

Dans la première étape, nous devons utiliser les modules suivants :

  • url : utilisé pour l'analyse des url, ici url.resolve() est utilisé pour générer un nom de domaine légal

  • async : un module pratique qui fournit des fonctions puissantes et un travail JavaScript asynchrone

  • cheerio : une implémentation de base jQuery rapide et flexible spécialement personnalisée pour le serveur

  • superagent : une demande client très pratique dans le module Agent nodejs

Installer les modules dépendants via npm


La deuxième étape consiste à introduire les modules dépendants via require pour déterminer l'URL de l'objet d'exploration :

var url = require("url");
var async = require("async");
var cheerio = require("cheerio");
var superagent = require("superagent");
var baseUrl = 'http://www.chenqaq.com';
Copier après la connexion

Étape 3 : utilisez superagent pour demander l'URL cible et utilisez cheerio pour traiter baseUrl afin d'obtenir l'URL du contenu cible, et enregistrez-la dans le tableau 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,解析每一个页面需要的信息
})
Copier après la connexion

Nous avons besoin a La fonction vérifie l'objet URL capturé. C'est très simple. Nous avons seulement besoin d'une fonction pour parcourir arr et l'imprimer :

function output(arr){
 for(var i = 0;i<arr.length;i++){
  console.log(arr[i]);
 }
}
Copier après la connexion

Étape 4 : Nous devons parcourir l'objet URL obtenu et analyser l'objet URL. informations requises par chaque page.

这里就需要用到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);
  })
 })
Copier après la connexion

得到上一步保存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通过加锁实现并发抢购功能

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Apr 26, 2024 pm 04:15 PM

Les techniques de concurrence et de multithreading utilisant les fonctions Java peuvent améliorer les performances des applications, notamment en suivant les étapes suivantes : Comprendre les concepts de concurrence et de multithreading. Tirez parti des bibliothèques de concurrence et multithread de Java telles que ExecutorService et Callable. Pratiquez des cas tels que la multiplication matricielle multithread pour réduire considérablement le temps d'exécution. Profitez des avantages d’une vitesse de réponse accrue des applications et d’une efficacité de traitement optimisée grâce à la concurrence et au multithreading.

Application de la concurrence et des coroutines dans la conception de l'API Golang Application de la concurrence et des coroutines dans la conception de l'API Golang May 07, 2024 pm 06:51 PM

La concurrence et les coroutines sont utilisées dans la conception GoAPI pour : Traitement hautes performances : traiter plusieurs requêtes simultanément pour améliorer les performances. Traitement asynchrone : utilisez des coroutines pour traiter des tâches (telles que l'envoi d'e-mails) de manière asynchrone, libérant ainsi le thread principal. Traitement des flux : utilisez des coroutines pour traiter efficacement les flux de données (tels que les lectures de bases de données).

Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

Quels sont les outils de concurrence couramment utilisés dans les bibliothèques de fonctions Java ? Quels sont les outils de concurrence couramment utilisés dans les bibliothèques de fonctions Java ? Apr 30, 2024 pm 01:39 PM

La bibliothèque de concurrence Java fournit une variété d'outils, notamment : Pool de threads : utilisé pour gérer les threads et améliorer l'efficacité. Verrouillage : utilisé pour synchroniser l'accès aux ressources partagées. Barrière : utilisée pour attendre que tous les threads atteignent un point spécifié. Opérations atomiques : unités indivisibles, assurant la sécurité des threads. File d'attente simultanée : file d'attente thread-safe qui permet à plusieurs threads de fonctionner simultanément.

Résoudre les problèmes de concurrence dans les fonctions multithread PHP Résoudre les problèmes de concurrence dans les fonctions multithread PHP May 01, 2024 pm 09:45 PM

Les problèmes de concurrence dans les fonctions multithread PHP peuvent être résolus en utilisant des outils de synchronisation (tels que les verrous mutex) pour gérer l'accès multithread aux ressources partagées. Utilisez des fonctions qui prennent en charge les options d'exclusion mutuelle pour garantir que la fonction n'est pas appelée à nouveau pendant l'exécution d'un autre thread. Enveloppez les fonctions non réentrantes dans des blocs synchronisés pour protéger les appels de fonction.

Comment la connexion à la base de données Java gère-t-elle les transactions et la concurrence ? Comment la connexion à la base de données Java gère-t-elle les transactions et la concurrence ? Apr 16, 2024 am 11:42 AM

Les transactions garantissent l'intégrité des données de la base de données, y compris l'atomicité, la cohérence, l'isolation et la durabilité. JDBC utilise l'interface Connection pour assurer le contrôle des transactions (setAutoCommit, commit, rollback). Les mécanismes de contrôle de concurrence coordonnent les opérations simultanées, à l'aide de verrous ou d'un contrôle de concurrence optimiste/pessimiste pour obtenir une isolation des transactions afin d'éviter les incohérences des données.

Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Apr 28, 2024 pm 04:12 PM

Les classes atomiques sont des classes thread-safe en Java qui fournissent des opérations ininterrompues et sont cruciales pour garantir l'intégrité des données dans des environnements concurrents. Java fournit les classes atomiques suivantes : AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Ces classes fournissent des méthodes pour obtenir, définir et comparer des valeurs afin de garantir que l'opération est atomique et ne sera pas interrompue par des threads. Les classes atomiques sont utiles lorsque vous travaillez avec des données partagées et évitez la corruption des données, comme la gestion de compteurs partagés pour les accès simultanés.

Comment éviter les blocages avec la concurrence et le multi-threading dans les fonctions Java ? Comment éviter les blocages avec la concurrence et le multi-threading dans les fonctions Java ? Apr 26, 2024 pm 06:09 PM

Les problèmes de blocage dans les environnements multithread peuvent être évités en définissant un ordre de verrouillage fixe et en acquérant les verrous de manière séquentielle. Définissez un mécanisme de délai d'attente pour abandonner l'attente lorsque le verrou ne peut pas être obtenu dans le délai spécifié. Utilisez l’algorithme de détection des blocages pour détecter l’état de blocage des threads et prendre des mesures de récupération. Dans des cas pratiques, le système de gestion des ressources définit un ordre de verrouillage global pour toutes les ressources et force les threads à acquérir les verrous requis afin d'éviter les blocages.

See all articles