0
votes

Code répondant à JavaScript pour des calculs énormes

La citation du livre "Comprendre Ecmascript 6" livre:

Les moteurs JavaScript sont construits sur le concept d'une boucle d'événement à une seule-filetage. Un seul filetage signifie qu'un seul morceau de code est exécuté à la fois.
...
Les moteurs JavaScript ne peuvent exécuter qu'un seul morceau de code à la fois. Ils doivent garder une trace du code destiné à courir. Ce code est conservés dans une file d'attente. Chaque fois qu'un code est prêt à être exécuté, Il est ajouté à la file d'attente de travail. Lorsque le moteur JavaScript est terminé Exécution du code, la boucle d'événement exécute le prochain travail de la file d'attente. le boucle d'événement est un processus à l'intérieur du moteur JavaScript qui surveille Exécution du code et gère la file d'attente de travail. Garder à l'esprit qu'en tant que La file d'attente, l'exécution d'emploi passe du premier emploi de la file d'attente au dernier.

signifie-t-il si la prochaine pièce de code de la file d'attente prend beaucoup de temps, l'application Web ne répondra pas à ce que le code sera terminé? Quelle est la taille de "morceau de code"? Est-ce que cela fonctionne le corps ou le bloc de code (i.e. code à l'intérieur des crochets {})? Le corps de fonction contient une autre fonction appelante (c'est le trou de lapin ...). Il me confonde.

Par exemple, il peut s'agir d'un code énorme de la fonction qui est utilisé dans l'initialisation de l'instance de promesse, ou un code énorme dans le .. ((résolution, rejet) => {...} : xxx


10 commentaires

Vous pouvez utiliser un Settimeout (() => {/ * votre gros calcul ici * /}, 0); pour l'exécuter en parallèle. Ou utilisez des webworkers.


@Faizuddinmohammed, Settimeout ((() => {/ * Votre gros calcul ici * /}, 0); ne fonctionne pas parallèlement comme je le sais. Cela crée un nouvel emploi dans la file d'attente de travail. Donc, cela ne vous aidera pas. Ai-je raison?


Oui, JS n'a aucun moyen d'utiliser plus d'un thread à moins que vous n'utilisiez webworkers. Mais en utilisant settimeout () ne bloquera pas votre page Web à partir de répondre tandis que les calculs lourds se produisent.


Mais que va-t-il se passer quand il est temps d'exécuter ce code comme un prochain travail de la file d'attente de travail?


Oui tu as raison. Je me suis trompé. 😆


@Faizuddinmohammed, je ne discute pas. J'essaie de comprendre.


Laissez-nous Continuez cette discussion en chat .


Si vous avez besoin de courants de courant, il est préférable de décharger sur webworkers, ce qui ne bloque pas le fil principal. Une autre option peut être de déterminer votre calcul lourd pour permettre à d'autres commandes d'être entrelacées sur la tâche Jobquante.


Le calcul est-il assez énorme pour le faire sur le serveur à la place?


@Andrewmorton, mais JavaScript peut être utilisé sur serveur (nœud.js). C'est à dire. Frontend et backend utilisent JavaScript.


3 Réponses :


-1
votes

Vous pouvez définir Webval pour chaque fonction pour réduire le temps d'exécution du script.


3 commentaires

Peut-être que vous vouliez dire settimeout au lieu de setInterval fonction?


Vous voulez probablement dire «SettimeOut», mais cela ne réduit pas le temps d'exécution d'un script, il permet de programmer simplement l'exécution sur X millisecondes (tout ce que vous choisissez) plus le temps nécessaire pour effacer toute la tâche


Vous choisirez une méthode récursive, il sera réduit le temps d'exécution.



0
votes

Cela signifie-t-il si la prochaine pièce de code dans la file d'attente de travail prend beaucoup de TEMPS DE TEMPS ENCHANCE N'EST PAS RÉPONDUER jusqu'à ce que le code soit fini?

Fondamentalement oui, le La complexité du temps importe beaucoup lorsque vous exécutez le code dans la boucle d'événement. Dans Nodejs, par exemple, il n'est pas recommandé d'utiliser la version synchrone de l'API de cryptage, c'est-à-dire:

  • crypto.randombytes (version synchrone)
  • crypto.randomfildsync
  • crypto.pbkdf2sync

    car ils impliquent un calcul coûteux.

    Quelle est la taille de "morceau de code"? Est-ce que la fonction fonctionne ou le bloc de code (i.e. code à l'intérieur des crochets {})?

    de votre devis, "morceau de code", je pense que cela fait référence à une déclaration, un seul thread ne peut exécuter qu'une instruction à la fois. Il n'existe donc aucune exécution parallèle qui ne peut atteindre avec plusieurs threads .

    Note latérale: plutôt que "taille de la morceau de code", il est plus important Complexité de calcul . Une "taille de morceau de code" assez large pourrait courir dans le temps constant O (1), tandis qu'un petit extrait pourrait prendre du temps exponentiel.

    Plus d'infos ici , en particulier pour Moteur Google V8.

    TL; DR : Complexité de calcul compte, en particulier dans des moteurs à un seul fileté. Pour les calculs de course à long terme, utilisez des travailleurs Web dans le navigateur ou un processus enfant si vous utilisez un nœud.


0 commentaires

0
votes

Concurrency-Modeil et Javascript_EventLoops

Eh bien, ma prise est de faire ces énormes opérations énormes en arrière-plan et de rendre l'application Web en premier (les morceaux de code qu'il exécute pour afficher l'application).

passer à travers ce sujet: Courez à Achèvement

J'espère que cela répond à votre question ..


0 commentaires