2016-08-16 2 views
1

Dieser Code generiert 3 Webseiten mit CheryPy. Es funktioniert, aber jetzt muss ich regelmäßig die Funktion "PageWeb" ausführen, um letzte Informationen von einer Abfrage zu haben. Wie Einfädeln in CherryPy zu verwenden:Wie man regelmäßig eine Funktion in CherryPy ausführt

from Widget import showLine 
from Widget import SocketLivestatus 
import cherrypy 
import threading 


def PageWeb(cluster): 
    # Open Socket 
    table = SocketLivestatus(['host1','host2'], 50000, cluster) 
    # Result 
    Line = showLine(table) 
    HTML = '''<!doctype html> 
      <html lang="en"> 
       <head><meta charset="utf-8"> 
       <title>Widget</title> 
       <link rel="stylesheet" href="css/font-awesome.min.css"> 
      </head> 
      <body style="background-color: #1F1F1F">'''+Line+'''</body> 
      </html>''' 
    return HTML 

#BEFORE 
re7 = PageWeb("re7") 
prod1 = PageWeb("prod1") 
prod2 = PageWeb("prod2") 
#MY GOAL 
re7 = threading.Timer(5.0, PageWeb("re7")).start() 
prod1 = threading.Timer(5.0, PageWeb("prod1")).start() 
prod2 = threading.Timer(5.0, PageWeb("prod2")).start() 


class HelloWorld(object): 
    @cherrypy.expose 
    def re7(self): 
     return re7 

    @cherrypy.expose 
    def prod1(self): 
     return prod1 

    @cherrypy.expose 
    def prod2(self): 
     return prod2 



if __name__ == '__main__': 
    cherrypy.config.update(
    {'server.socket_host': '0.0.0.0'}) 
    cherrypy.quickstart(HelloWorld(),config={ 
     '/': 
     { 'tools.staticdir.on':True, 
      'tools.staticdir.dir': "/app" 
     } 
     # '/fonts': 
     # { 'tools.staticdir.on':True, 
     # 'tools.staticdir.dir': "/app" 
     # } 
    }) 

Das Problem über threading.Timer ist (5,0, PageWeb ("...")) start() einen Fehler zurück.

Traceback (most recent call last): 
    File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner 
    self.run() 
    File "/usr/lib64/python2.7/threading.py", line 1083, in run 
    self.function(*self.args, **self.kwargs) 
TypeError: 'str' object is not callable 

I möchte helfen, Threading-Funktion in CherryPy zu verwenden.

+0

Vielleicht sollten Sie diese Arbeit an externe Warteschlange wie RQ delegieren: http://Stackoverflow.com/a/36750783/595220 – webKnjaZ

Antwort

1

A threading.Timer läuft nur einmal:

This class represents an action that should be run only after a certain amount of time has passed

Nach einigen Experimenten scheint es, dass cherrypy nicht gut mit Gewinde funktioniert. Der folgende Code verwendet die Bibliothek multiprocessing, um eine separate Process zu erstellen. Die HTML wird geteilt, indem sie es als ersten Eintrag eines verwalteten list Speicherung:

import cherrypy 
import multiprocessing 
import time 

def PageWeb(cluster, sleep_interval, lock, shared_result): 
    counter = 0 
    while True: 
     HTML = '''<!doctype html> 
       <html lang="en"> 
        <head><meta charset="utf-8"> 
        <title>Widget</title> 
        <link rel="stylesheet" href="css/font-awesome.min.css"> 
       </head> 
       <body style="background-color: #1F1F1F">'''+str(counter)+'''</body> 
       </html>''' 
     counter += 1 
     with lock: 
      shared_result[0] = HTML 
     time.sleep(sleep_interval) 

class HelloWorld(object): 
    def __init__(self): 
     self.re7_lock = multiprocessing.Lock() 
     self.manager = multiprocessing.Manager() 
     self.re7_result = self.manager.list() 
     self.re7_result.append('') 
     arg_list = ("re7", 5.0, self.re7_lock, self.re7_result) 
     self.re7_process = multiprocessing.Process(target=PageWeb, args=arg_list) 
     self.re7_process.daemon = True 
     self.re7_process.start() 

    @cherrypy.expose 
    def re7(self): 
     with self.re7_lock: 
      return str(self.re7_result[0]) 

cherrypy.quickstart(HelloWorld()) 

Dieser Code ist ein minimal, complete, and verifiable example. Sie sollten es in Ihren Code integrieren können.

+0

Ich nicht warum, aber ich habe eine weiße Seite ohne meine HTML-Code, wenn ich CherryPy WebServer ausgeführt . – user6066403

+0

Ich habe "import time" hinzugefügt – user6066403

+0

Sie können dies mit 'print' Anweisungen oder einem Debugger debuggen. Versuchen Sie 'print shared_result' nach' shared_result = HTML' und 'print_re7_result' vor' return_re7_result' zu setzen. –

Verwandte Themen