简体   繁体   中英

Python HTTPServer and periodic tasks

I´m using HTTPServer to listen for incoming POST requests and serving them. All is working fine with that.

I need to add some periodic tasks in the script (every X seconds: do something). As the HTTP server takes full command after

def run(server_class=HTTPServer, handler_class=S, port=9999):

  server_address = (ethernetIP, port)
  httpd = server_class(server_address, handler_class)
  httpd.serve_forever()

I guess if there´s any way to include a check for time.time() as part of:

class S(BaseHTTPRequestHandler):

def _set_response(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()

def do_GET(self):
    self._set_response()
    self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))

def do_POST(self):
    # my stuff here

Any ideas are welcome. Thanks!

Thanks to @rdas for pointing me to the separate thread solution. I tried schedule but it didn´t work with the HTTP server, because I can´t tell the script to run the pending jobs.

I tried with threading , running my periodic task as deamon.. and it worked: Here´s the code structure:

import time
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer


polTime = 60            # how often we touch the file
polFile = "myfile.abc"


# this is the deamon thread

def polUpdate():
    while True:
        thisSecond = int(time.time())
        if  thisSecond % polTime == 0:      # every X seconds
            f = open(polFile,"w")
            f.close()               # touch and close
            time.sleep(1)           # avoid loopbacks
    return "should never come this way"


# here´s the http server starter

def run(server_class=HTTPServer, handler_class=S, port=9999):
    
    server_address = (ethernetIP, port)
    httpd = server_class(server_address, handler_class)
    
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    sys.exit(1)


# init the thread as deamon

d = threading.Thread(target=polUpdate, name='Daemon')
d.setDaemon(True)
d.start()

# runs the HTTP server
run(port=conf_port)

The HTTP server doesn´t block the thread, so it works great.

By the way, I´m using the file 'touching' as proof of life for the process.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM