Ejecutar gevent procesos y servidor simultáneamente
Pregunta
Cómo ejecutar un módulo dado quiero ejecutar algunas funciones simultáneamente que no son necesariamente el uso de enrutamiento (podría ser el demonio de servicios), mientras que al mismo tiempo que ejecuta el servidor de aplicaciones?
Por ejemplo:
#some other route functions app.post(...)
#some other concurrent functions
def alarm():
'''
Run this service every X duration
'''
ALARM = 21
try:
while 1:
#checking time and doing something. Then finding INTERVAL
gevent.sleep(INTERVAL)
except KeyboardInterrupt,e:
print 'exiting'
¿Tengo que usar la anterior como esta después de principal ?
gevent.joinall(gevent.spawn(alarm))
app.run(....)
o
gevent.joinall((gevent.spawn(alarm),gevent.spawn(app.run)))
El objetivo es ejecutar estas alarma como demonio de los servicios, hacen su trabajo y pausa mientras que el resto de las operaciones de servicio de trabajo como de costumbre.El servidor debe comenzar simultáneamente así.me corrija si no estoy en el camino correcto.
Solución
Gevent viene con sus propios WSGI servidores, por lo que no es realmente necesario el uso de app.run
.Los servidores son:
Ambos proporcionan la misma interfaz.
Usted puede utilizar estas para lograr lo que quieres:
import gevent
import gevent.monkey
gevent.monkey.patch_all()
import requests
from gevent.pywsgi import WSGIServer
# app = YourBottleApp
def alarm():
'''
Run this service every X duration
'''
ALARM = 21
while 1:
#checking time and doing something. Then finding INTERVAL
gevent.sleep(INTERVAL)
if __name__ == '__main__':
http_server = WSGIServer(('', 8080), app)
srv_greenlet = gevent.spawn(http_server.serve_forever)
alarm_greenlet = gevent.spawn(alarm)
try:
gevent.joinall([srv_greenlet, alarm_greenlet])
except KeyboardInterrupt:
http_server.stop()
print 'Quitting'