2016-08-16 10 views
1

このコードは、CheryPyを使用して3つのWebページを生成します。それは動作しますが、私は定期的に "PageWeb"関数を実行して、最後の情報をクエリから取得する必要があります。 どうCherryPyにでスレッドを使用するには:。CherryPyの関数を定期的にexecする方法

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" 
     # } 
    }) 

を問題はthreading.Timer(5.0、PageWeb( "..."))についてですエラーを返す)(開始:

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 CherryPyでスレッド機能を使用するのに役立つと思います。

+0

おそらく、この作業をRQのような外部キューに委託する方がよいでしょう。http://stackoverflow.com/a/36750783/595220 – webKnjaZ

答えて

1

A threading.Timerは一度だけ実行されます。いくつかの実験をした後

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

cherrypyスレッドでうまく動作しないことが表示されます。次のコードでは、multiprocessingライブラリを使用して別のProcessを作成しています。 HTMLは、管理listの最初のエントリとして格納することによって共有されている:

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()) 

このコードはminimal, complete, and verifiable exampleあります。それをあなたのコードと統合できるはずです。

+0

CherryPy webServerを実行すると私はHTMLコードがない白いページがあります。 – user6066403

+0

"import time"を追加しました – user6066403

+0

これは 'print'文やデバッガを使ってデバッグできます。 'return re7_result'の前に' shared_result = HTML'と 'print re7_result'の後に' print shared_result'を入れてみてください。 –

関連する問題