javascript - Existe-t-il un moyen de détecter le temps d'exécution d'une méthode synchrone en JS?
迷茫2017-06-15 09:23:26
0
5
902
La particularité est la suivante : y a-t-il quelqu'un qui peut détecter le temps d'exécution de la méthode de synchronisation ? Si le temps d'exécution est trop long, je prendrai l'initiative de tuer cette méthode
S'il s'agit d'une méthode fournie par une bibliothèque tierce, cela dépend si elle fournit elle-même une méthode d'arrêt. Sinon, vous ne pouvez rien faire ;
S'il s'agit d'un fichier i/o/delete/create, vous ne pourrez peut-être pas l'arrêter, mais vous pouvez écrire une fonction inverse pour restaurer l'état d'origine après avoir signalé une erreur
;
Si cette méthode est écrite par vous-même et comporte plusieurs sous-fonctions, vous pouvez alors définir une minuterie à l'intérieur de la fonction et vérifier si le temps dépasse la valeur autorisée avant d'exécuter chaque sous-fonction
.
Si cette méthode est écrite par vous et ne comporte qu'une seule étape, comme c'est une méthode qui prend du temps, alors il y a probablement une boucle, vous pouvez donc vérifier l'heure à chaque fois qu'elle boucle. . .
Du point de vue JS, lors de l'exécution d'une méthode synchrone, toute l'application y sera bloquée. À ce moment, même le rappel déclenché de manière asynchrone par setTimeout ne peut être exécuté dans la boucle d'événements qu'une fois l'exécution de la méthode synchrone terminée, il ne peut donc pas être exécuté dans la méthode synchrone. Vérifiez son propre temps d'exécution et tuez-vous.
Du point de vue de l'informatique, la question posée est en fait le problème d'arrêt classique :
Le problème d'arrêt (anglais : halting problem) est un problème de théorie de la calculabilité en logique et en mathématiques. En termes simples, le problème de l'arrêt consiste à déterminer si un programme peut mettre fin à son fonctionnement dans un délai limité. Ce problème est équivalent au problème de décision suivant : existe-t-il un programme P. Pour tout programme d'entrée w, on peut juger que w se terminera dans un temps limité ou bouclera sans fin.
Ce problème est NP-difficile, ce qui signifie qu'il n'existe pas d'algorithme avec une complexité temporelle acceptable pour le résoudre directement.
Mais au-delà de l'algorithme académique, il existe de nombreuses solutions de contournement en ingénierie, comme l'utilisation de Web Worker ou du mécanisme de gestion des processus de PM2, etc., qui ne seront pas abordées ici.
Ensuite, vous ne pouvez faire que du multi-threading... http://www.w3school.com.cn/ht... Cependant, comment tuer js est aussi un mystère... En fin de compte... vous pouvez directement Ne serait-il pas préférable d'utiliser asynchrone||||
Webworker peut exécuter votre logique de calcul dans un autre thread, la méthode onmessage peut accepter les résultats de l'exécution et la méthode terminate peut mettre fin à l'exécution de webworker
var job001DoneIndictor=false;
var myWorker = new Worker('job001.js');
//接收worker传递过来的数据
myWorker.onmessage = function(event){
job001DoneIndictor=true;
};
setTimeout(function(){
if(!job001DoneIndictor){
myWorker.terminate();
myWorker =null;
}
},5000);//设置超时检测时间
Cela dépend de votre méthode de synchronisation ?
S'il s'agit d'une méthode fournie par une bibliothèque tierce, cela dépend si elle fournit elle-même une méthode d'arrêt. Sinon, vous ne pouvez rien faire ;
S'il s'agit d'un fichier i/o/delete/create, vous ne pourrez peut-être pas l'arrêter, mais vous pouvez écrire une fonction inverse pour restaurer l'état d'origine après avoir signalé une erreur
Si cette méthode est écrite par vous-même et comporte plusieurs sous-fonctions, vous pouvez alors définir une minuterie à l'intérieur de la fonction et vérifier si le temps dépasse la valeur autorisée avant d'exécuter chaque sous-fonction
Si cette méthode est écrite par vous et ne comporte qu'une seule étape, comme c'est une méthode qui prend du temps, alors il y a probablement une boucle, vous pouvez donc vérifier l'heure à chaque fois qu'elle boucle. . .
Du point de vue JS, lors de l'exécution d'une méthode synchrone, toute l'application y sera bloquée. À ce moment, même le rappel déclenché de manière asynchrone par setTimeout ne peut être exécuté dans la boucle d'événements qu'une fois l'exécution de la méthode synchrone terminée, il ne peut donc pas être exécuté dans la méthode synchrone. Vérifiez son propre temps d'exécution et tuez-vous.
Du point de vue de l'informatique, la question posée est en fait le problème d'arrêt classique :
Ce problème est NP-difficile, ce qui signifie qu'il n'existe pas d'algorithme avec une complexité temporelle acceptable pour le résoudre directement.
Mais au-delà de l'algorithme académique, il existe de nombreuses solutions de contournement en ingénierie, comme l'utilisation de Web Worker ou du mécanisme de gestion des processus de PM2, etc., qui ne seront pas abordées ici.
Ensuite, vous ne pouvez faire que du multi-threading...
http://www.w3school.com.cn/ht...
Cependant, comment tuer js est aussi un mystère...
En fin de compte... vous pouvez directement Ne serait-il pas préférable d'utiliser asynchrone||||
On m'a rappelé que ce n'est effectivement pas la solution. Une autre solution bas de gamme n'est peut-être que celle-ci :
Ne convient pas nécessairement à toutes les entreprises, et les points eux-mêmes ralentiront le processus.
Webworker peut exécuter votre logique de calcul dans un autre thread, la méthode onmessage peut accepter les résultats de l'exécution et la méthode terminate
peut mettre fin à l'exécution de webworker