Подтвердить что ты не робот

CherryPy с дополнительными потоками для пользовательских заданий

Мы разрабатываем систему на основе CherryPy, которая помимо обслуживания веб-запросов должна выполнять задачи/задания параллельно. Мы хотим, чтобы это был единственный процесс, выполняемый как демон, и создавал потоки для всех параллельных заданий, таких как запланированные задачи или собирания данных в Интернете.

Я просматривал документацию CherryPy и знаю, что она объединяет потоки, создавая потоки для всех пользовательских запросов. Однако я не могу найти документацию о том, как создавать и управлять потоками для пользовательских заданий. У CherryPy есть обработчик потока, с которым мы можем подключиться или можем/должны ли мы писать собственный обработчик, который подключается к CherryPy?

4b9b3361

Ответ 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