fonction avec timeout

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Pelletier
Messages : 16
Enregistré le : 04 Déc 2017, 06:28

fonction avec timeout

Messagepar Stéphane Pelletier » 30 Mar 2021, 10:50

Bonjour,

Je souhaite utiliser la fonction

Code : Tout sélectionner

readline()
avec un "timeout" de mannière a arreter le processus si pas de réponse au bout de x seconde.
J'ai trouvé cette fonction qui apparement fonctionne sur linux (je ne l'ai pas testé):

Code : Tout sélectionner

timeout<-function(expr, seconds = 60){
  killer.pid <- system(intern = TRUE, paste(" (sleep", seconds,
                                            " ; kill -INT", Sys.getpid(),
                                            ")>/dev/null&\n echo $!"))
  on.exit(system(paste("kill", killer.pid, "> /dev/null 2>&1")))
  withCallingHandlers(expr, interrupt=function(...)stop("Timed
out", call.=FALSE))
}

J'ai donc voulu l'adapté pour windows. Je l'ai donc réecrit comme suit :

Code : Tout sélectionner

timeout<-function(expr, seconds = 60){
  killer.pid <- system(intern = TRUE, paste("timeout /T", seconds," && taskkill /F /PID ", Sys.getpid()))
  withCallingHandlers(expr, interrupt=function(...)stop("Timedout", call.=FALSE))
}


Le premier problème que je rencontre est que apparement avec la fonction

Code : Tout sélectionner

system()
on ne peux pas mettre 2 commandes séparées par && (alors que ça fonctionne dans l'invité de commande windows).

J'ai donc splitté cette partie en 2, ce qui me donne la fonction (réecrite un peu differement) suivante :

Code : Tout sélectionner

timeout<-function(expr, seconds = 60){
  killer.pid1 <- system(intern = TRUE, paste("PING -n",seconds, "127.0.0.1"))
  killer.pid2 <- system(intern = TRUE, paste("TASKKILL /F /PID ", Sys.getpid()))
  withCallingHandlers(expr, interrupt=function(...)stop("Timedout", call.=FALSE))
}

Maintenant ça marche presque, c'est a dire que si je fait par exemple

Code : Tout sélectionner

timeout(readline("Hello world!"),seconds=5)

La fonction fait bien une pause de 5 secondes et stop R complètement avant d'evaluer l'expression (readline() par exemple). Il s'agit pourtant de la version linux pour windows. Je ne comprend pas trop !

Quelqu'un aurait t'il une idée de ce qu'il se passe.
Aussi, c'est la premiere fois que j'utilise la fonction

Code : Tout sélectionner

withCallingHandlers()
donc je ne sais pas s'il y a un soucis a ce niveau.
Merci par avance.
Bonne journée

Stéphane

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: fonction avec timeout

Messagepar Mickael Canouil » 30 Mar 2021, 14:17

Bonjour,

je vais supposer que s'il y a besoin d'un "timeout", c'est que le fichier n'est pas local et parce-que personnellement, je ne suis pas fan de réinventer la roue, je vais rester sur ce qui existe nativement dans R ou depuis longtemps dans des extensions.

N'est-il pas plus simple d'utiliser l'option R?

Code : Tout sélectionner

option(timeout = XXX)

timeout:
positive integer. The timeout for some Internet operations, in seconds. Default 60 (seconds) but can be set from environment variable R_DEFAULT_INTERNET_TIMEOUT. (Invalid values of the option or the variable are silently ignored: non-integer numeric values will be truncated.) See download.file and connections.

Il y a aussi R.utils::withTimeout() (2010-12-07)

Code : Tout sélectionner

R.utils::withTimeout(readLines(...), timeout = 60

Cordialelent,
Mickaël
mickael.canouil.fr | rlille.fr

Stéphane Pelletier
Messages : 16
Enregistré le : 04 Déc 2017, 06:28

Re: fonction avec timeout

Messagepar Stéphane Pelletier » 30 Mar 2021, 15:36

Bonjour,

Merci pour le retour :)
je ne suis pas fan de réinventer la roue, je vais rester sur ce qui existe nativement dans R

Moi aussi. C'est juste que ce qui est proposé nativement ne repond pas à mes besoins.
En fait je souhaite utilisé la fonction

Code : Tout sélectionner

readline()
et pas

Code : Tout sélectionner

readLines()
.
readline() permets, par exemple, de poser une question est d'enregistrer la réponse dans un vecteur. Sauf que tant que personne ne répond ou s'il n'y a rien à répondre, ça reste bloqué à ce niveau, d'ou l'idée de mettre un timeout

Et

Code : Tout sélectionner

option(timeout = XXX)
ne marche pas dans ce cas-là (ou bien c'est moi qui ne sait pas l'utiliser).

Bon apres midi :)

Stéphane

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: fonction avec timeout

Messagepar Mickael Canouil » 31 Mar 2021, 07:13

Et en quoi R.utils::withTimeout() ne répond pas à la problématique ?
Mickaël
mickael.canouil.fr | rlille.fr

Stéphane Pelletier
Messages : 16
Enregistré le : 04 Déc 2017, 06:28

Re: fonction avec timeout

Messagepar Stéphane Pelletier » 31 Mar 2021, 09:23

Et en quoi R.utils::withTimeout() ne répond pas à la problématique ?


Apparemment elle n'est pas prévu pour ça :( (https://rdrr.io/cran/R.utils/man/withTimeout.html)
Furthermore, it is not possible to interrupt/break out of a "readline" prompt (e.g. readline() and readLines()) using timeouts; the timeout exception will not be thrown until after the user completes the prompt (i.e. after pressing ENTER).


Stéphane

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: fonction avec timeout

Messagepar Logez Maxime » 31 Mar 2021, 09:47

Bonjour,

Code : Tout sélectionner

killer.pid2 <- function(...) system(intern = TRUE, paste("TASKKILL /F /PID ", Sys.getpid()))
res <- tryCatch(R.utils:::withTimeout(readline("N = "), timeout = 5),
  error = killer.pid2)
Cordialement,
Maxime

Stéphane Pelletier
Messages : 16
Enregistré le : 04 Déc 2017, 06:28

Re: fonction avec timeout

Messagepar Stéphane Pelletier » 31 Mar 2021, 16:46

Merci beaucoup Maxime, ca correspond à mes attentes, le processus s'interrompe au bout de 5 sec (par exemple), mais l'expression et a nouveau réévalué indéfiniment (sans timeout) juste après.

Mais merci beaucoup, c'est proche du résultat attendu. Je dois bidouiller encore un peu.

Merci beaucoup pour l'aide.

Bonne soirée

Stéphane


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité