Executar gevent processos e simultaneamente
Pergunta
Como executar um determinado módulo de dado que deseja executar algumas funções em simultâneo, que não são necessariamente usando o roteamento (poderia ser daemon de serviços) ao mesmo tempo, executando o servidor de aplicativos?
Por exemplo:
#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'
Eu tenho que usar o acima como esta depois principal ?
gevent.joinall(gevent.spawn(alarm))
app.run(....)
ou
gevent.joinall((gevent.spawn(alarm),gevent.spawn(app.run)))
O objetivo é executar estas alarme como daemons de serviço, fazer o seu trabalho e soneca enquanto o resto do serviço de operações de trabalhar como de costume.O servidor deve iniciar-se concomitantemente bem.corrija-me se não estou no caminho certo.
Solução
Gevent vem com sua própria WSGI servidores, por isso não é realmente necessário o uso de app.run
.Os servidores são:
Ambos fornecem a mesma interface.
Você pode usá-los para conseguir o que deseja:
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'