CherryPy具有用于自定义作业的其他线程

时间:2012-02-09 08:37:47

标签: python multithreading daemon cherrypy

我们正在设计一个基于CherryPy的系统,除了提供Web请求外,还需要并行执行任务/作业。我们希望它是一个作为守护进程运行的单个进程,并为所有并行作业创建线程,如计划任务或在线收集数据。

我一直在浏览CherryPy文档并知道它是为所有用户请求创建线程的线程池。但是,我似乎无法找到有关如何为自定义作业创建和管理线程的文档。 CherryPy是否有一个我们可以挂钩的线程处理程序,或者我们应该编写自己的挂钩到CherryPy的处理程序吗?

2 个答案:

答案 0 :(得分:14)

订阅Monitor个实例:

from cherrypy.process.plugins import Monitor

def foo():
    my.store.collect_data('things', 'stuff')

Monitor(cherrypy.engine, foo, frequency=300).subscribe()

这将在其自己的线程中每300秒运行foo函数,该线程将在您调用engine.start时启动,并在您调用engine.stop时停止(或在进程退出时停止)

答案 1 :(得分:1)

我想通过在使用之前分享我为测试它而编写的脚本来完成fumanchu的优秀答案。它使用python瓶,证明建议也在使用它。

#!/usr/bin/env python3

import bottle
import time
import threading
import cherrypy
from cherrypy.process.plugins import Monitor

srv = bottle.Bottle()
lock = threading.Lock()
x = 0
y = 0

def increment ():
    print("incrementing...")
    with lock:
        global x
        time.sleep(1)
        x += 1
    print("Done.")

monitor = Monitor(cherrypy.engine, increment, frequency=1)

@srv.get("/")
def read ():
    with lock:
        return "Got: %d %d." % (x, y)

@srv.post("/periodic/<x:int>")
def periodic (x):
    if x: monitor.start()
    else: monitor.stop()

@srv.put("/<V:int>")
def write (V):
    print("Serving")
    with lock:
        global x
        global y
        x = V
        time.sleep(5)
        y = V
        print("gtfo")
    return "OK. Current: %d." % x

srv.run(server='cherrypy')

用法:

启用服务器后,使用curl http://localhost:8080读取,curl http://localhost:8080/<value>写入一些值(需要5秒,而所有读取都将挂起),最后curl http://localhost:8080/periodic/0和{{ 1}}分别禁用/启用周期性写入。每次写入将花费1秒钟,在此期间将进行读取和修改。

P.S。使用python2和python3