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