CherryPy с дополнительными потоками для пользовательских заданий
мы разрабатываем систему на основе CherryPy, которая помимо обслуживания веб-запросов должна выполнять задачи/задания параллельно. Мы хотим, чтобы это был единый процесс, работающий как демон и создающий потоки для всех параллельных заданий, таких как запланированные задачи или сбор данных в интернете.
Я просматривал документацию CherryPy и знаю, что это поток-пул, создающий потоки для всех запросов пользователей. Однако я не могу найти документацию о том, как создавать и управлять темы для пользовательских заданий. Есть ли у CherryPy обработчик потоков, к которому мы можем подключиться или можем/должны ли мы написать наш собственный обработчик, который подключается к CherryPy?
2 ответов
подписаться монитор например:
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
(или при выходе из процесса).
Я хотел бы завершить отличный ответ 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
и curl http://localhost:8080/periodic/1
отключить / включить соответственно периодическую запись. Каждая запись займет 1 секунду, во время которого будут висеть чтения и модификации.
П. С. Работает с python2 и питон3