How to launch a function at regular time intervals ?

David davigier at googlemail.com
Fri Aug 14 00:52:52 CEST 2009


On 13 août, 21:28, Dave Angel <da... at ieee.org> wrote:
> David wrote:
> > Thanks all for your answers. As suggested by Dave and Frank, I am
> > indeed looking for the main program to continue running in the
> > background (I have several functions I want to launch, each at a
> > predefined time interval). I like Frank's solution, on the paper it
> > seems it would do what I am looking for, but I cannot succeed in
> > having it working. I guess I've been stuck with this problem for too
> > long and can't succeed in using my brain accurately anymore... ;-)
>
> > I defined the class as defined by Frank, and I then inserted the
> > following code in a While True loop, without any other code (the idea
> > is just to test Frank's solution before really using it in my
> > program):
>
> >     func = MyFunction()
> >     func.start()
>
> >     func.stop()
> >     func.join()
>
> > However I'm not getting the expected behavior. It's not taking into
> > account the 30 sec wait, the function is called again and again
> > without any time interval... Any idea ?
>
> > Again, thanks a lot.
>
> Why don't you include the code you're actually trying, instead of just
> trying to describe it.  Frank's class didn't call any function, it just
> had a place to do it.  So we really don't know what you're running, nor
> what about it is wrong.
>
> Perhaps a few well placed print statements?
>
> DaveA

Yes, I guess it would be more simple. Here is really what I am trying
to do. I simplified the functions, but the purpose is to write some
text in a local file every x seconds (here, I'm just writing the
timestamp, i.e. a string representing the date & time, every 10
seconds) and to transfer this file to a distant server via FTP every y
seconds (20 seconds in the example below). My code is a little bit
more complicated because each time I transfer the file, I delete the
local file which is then recreated when data is written, but for
simplicity I left this out in the code below. So, here is the code
I've been using to test Frank's code. I've been struggling with using
or not a While True loop or not, and everything I try seems to run
into issues.

import threading
from datetime import datetime
import ftplib

class CFtpConnection:
    """FTP Connection parameters"""
    def __init__(self, host, port, timeout, user, passwd):
        self.host = ""
        self.port = 21
        self.timeout = 60
        self.user = ""
        self.passwd = ""

class CStoreData(threading.Thread):
    """Write timestamp in a file every 10 seconds in separate
thread"""

    def __init__(self, timestamp):
        threading.Thread.__init__(self)
        self.event = threading.Event()
        self.timestamp = timestamp

    def run(self):
        while not self.event.is_set():
            file_handler = open("Test.txt", 'a')
            file_handler.write(self.timestamp.strftime("%y%m%d%H%M%S
\n"))
            file_handler.close()
            self.event.wait(10)

    def stop(self):
        self.event.set()

class CTransferData(threading.Thread):
    """Transfer timestamp file every 20 seconds in separate thread"""

    def __init__(self, ftp_connection):
        threading.Thread.__init__(self)
        self.event = threading.Event()
        self.ftp_connection = ftp_connection

    def run(self):
        while not self.event.is_set():
            file_handler = open("Test.txt", 'r')
            Ftp_handler = ftplib.FTP('')
            Ftp_handler.connect(self.ftp_connection.host,
self.ftp_connection.port, self.ftp_connection.timeout)
            Ftp_handler.login(self.ftp_connection.user,
self.ftp_connection.passwd)
            Ftp_handler.storbinary("STOR Test.txt", file_handler)
            file_handler.close()
            Ftp_handler.close()
            self.event.wait(20)

    def stop(self):
        self.event.set()

ftp_connection = CFtpConnection("", 21, 60, "", "")
ftp_connection.host = '127.0.0.1'
ftp_connection.user = "admin"
ftp_connection.passwd = "admin"

while(1):
  timestamp = datetime.now()
  func_store_data = CStoreData(timestamp)
  func_store_data.start()

  func_transfer_data = CTransferData(ftp_connection)
  func_transfer_data.start()

func_store_data.stop()
func_store_data.join()

func_transfer_data.stop()
func_transfer_data.join()



More information about the Python-list mailing list