我们正在设计一个基于CherryPy的系统,除了提供Web请求外,还需要并行执行任务/作业。我们希望它是一个作为守护进程运行的单个进程,并为所有并行作业创建线程,如计划任务或在线收集数据。
我一直在浏览CherryPy文档并知道它是为所有用户请求创建线程的线程池。但是,我似乎无法找到有关如何为自定义作业创建和管理线程的文档。 CherryPy是否有一个我们可以挂钩的线程处理程序,或者我们应该编写自己的挂钩到CherryPy的处理程序吗?
答案 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