CherryPy с дополнительными потоками для пользовательских заданий
Мы разрабатываем систему на основе CherryPy, которая помимо обслуживания веб-запросов должна выполнять задачи/задания параллельно. Мы хотим, чтобы это был единственный процесс, выполняемый как демон, и создавал потоки для всех параллельных заданий, таких как запланированные задачи или собирания данных в Интернете.
Я просматривал документацию CherryPy и знаю, что она объединяет потоки, создавая потоки для всех пользовательских запросов. Однако я не могу найти документацию о том, как создавать и управлять потоками для пользовательских заданий. У CherryPy есть обработчик потока, с которым мы можем подключиться или можем/должны ли мы писать собственный обработчик, который подключается к CherryPy?
Ответы
Ответ 1
Подпишите Monitor экземпляр:
from cherrypy.process.plugins import Monitor
def foo():
my.store.collect_data('things', 'stuff')
Monitor(cherrypy.engine, foo, frequency=300).subscribe()
Это будет запускать функцию foo
каждые 300 секунд в своем потоке, и этот поток начнется, когда вы вызовете engine.start
и остановитесь, когда вы вызовете engine.stop
(или при выходе процесса).
Ответ 2
Я хотел бы завершить fumanchu отличный ответ, разделив script, который я написал для тестирования этого, прежде чем использовать его. Он использует бутылку 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
и curl http://localhost:8080/periodic/1
для отключения/включения соответственно периодическая запись. Каждая запись займет 1 секунду, в течение которой будут выполняться считывания и изменения.
P.s. Работа с python2 и python3