Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    eseguire una sub ogni tot minuti

    Come faccio ad eseguire una funzione ogni tot minuti?

    codice:
    $socket->listen();
    
    while ( $client = $socket->accept() )
    {
    
        while ( $str = <$client> ) { syswrite $client, uc($str) . "\r\n"; }
        
        # esegui funzione() ogni 10 minuti...
    
    }
    
    sub funzione() { return }
    non è che devo eseguirla per forza dentro al ciclo while...ma di instinto mi è venuta di mettere la chiamata la dentro...

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Per la ripetizione, ti conviene usare le funzioni del sistema operativo:
    per linux vedi cron, crontab; per windows non so.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    non si può fare in perl puro?

    io eseguo un file .pl che all'interno ha:

    codice:
    while(1)
    {
        # esegui sub() ogni 10 min....
    }
    il file gira in eterno...e ogni 10 min esegue una sub()...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    In teoria si puo` fare, in pratica rischi un carico eccessivo del server.
    codice:
    while(1) {
      @adesso = localtime(time);
       // solo nei primi due secondi di ogni minuto divisibile per 10
      if($adesso[1]%10==0 && $adesso[0]<2) {
        &esegui_funzione;
      }
    }
    Il problema e` che a questo punto il server potrebbe essere bloccato da questa routine (ma dipende da come il server risponde agli interrupt del SO).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    cmq non è uno script CGI richiamato da browser ma uno script in locale che gira sul mio Mac

  6. #6

    forse ho risolto con alarm()

    Cosi' facendo e sorta un'altra complicazione...

    Il codice sottostante non si comporta come dovrebbe!

    si mette in ascolto e ogni 10 secs dovrebbe eseguire "temporizzata",
    ma invece dopo i primi 10 secs mi esegue "temporizzata" ma poi lo script
    non sta
    più in ascolto...roba da matti!

    codice:
    $socket->listen();
    
    $SIG{'ALRM'} = \&temporizzata;
    alarm(10);
    
    while ( $client = $socket->accept() )
    {
       while ( $str = <$client> ) { syswrite $client, uc($str) . "\r\n"; }
    }
    
    sub temporizzata
    {
      my $dataora = gmtime(time());
      print "\n",$dataora,"\n";
      $SIG{'ALRM'} = \&temporizzata;
      alarm(10);
    }

    alcontrario ho notato che se faccio un ciclo while(1) tutto va a
    meraviglia:

    codice:
    $SIG{'ALRM'} = \&temporizzata;
    alarm(10);
    
    while (1) {}
    
    sub temporizzata
    {
      my $dataora = gmtime(time());
      print "\n",$dataora,"\n";
      $SIG{'ALRM'} = \&temporizzata;
      alarm(10);
    }
    ogni 10 secs mi esegue "temporizzata" !!!

    ne consegue che io ho provato a fare questo:

    codice:
    $socket->listen();
    
    $SIG{'ALRM'} = \&temporizzata;
    alarm(10);
    
    while (1)
    {
    
        $client = $socket->accept();
        
        if ($client) {
          while ( $str = <$client> ) { syswrite $client, uc($str) . "\r\n"; }
        }
        
    }
    
    sub temporizzata
    {
      my $dataora = gmtime(time());
      print "\n",$dataora,"\n";
      $SIG{'ALRM'} = \&temporizzata;
      alarm(10);
    }
    ... e devo dire che funziona,ma non vorrei che i puristi del perl
    storcessero il naso,ovvero
    che differenza c'è nel prepararsi a ricevere un client con:

    codice:
    while ( $client = $socket->accept() ) { #code... }
    e

    codice:
    while(1) { $client = $socket->accept(); # other code... }

    Grazie a tutti!

  7. #7
    $socket->accept() è bloccante, nel senso che non va avanti fino a che non riceve qualcosa.

    con while (1) svincoli l'esecuzione dal blocco.

    Se un codice funziona, non da problemi e da buone performance va usato e non esiste purezza o altre cavolate del genere.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.