Führen Sie Gevent-Prozesse und Server gleichzeitig aus
Frage
Wie führe ich ein bestimmtes Modul aus, wenn ich einige Funktionen gleichzeitig ausführen möchte, die nicht unbedingt Routing verwenden (könnte Daemon-Dienste sein), während gleichzeitig der App-Server ausgeführt wird?
Zum Beispiel:
#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'
Muss ich das oben Genannte danach so verwenden? hauptsächlich ?
gevent.joinall(gevent.spawn(alarm))
app.run(....)
oder
gevent.joinall((gevent.spawn(alarm),gevent.spawn(app.run)))
Das Ziel besteht darin, diese Alarmdienste wie Daemon-Dienste auszuführen, ihre Arbeit zu erledigen und in den Ruhezustand zu versetzen, während der Rest der Dienstvorgänge wie gewohnt abläuft.Gleichzeitig sollte auch der Server starten.Korrigiert mich, wenn ich nicht auf dem richtigen Weg bin.
Lösung
Gevent verfügt über eigene WSGI-Server, sodass deren Verwendung eigentlich nicht erforderlich ist app.run
.Die Server sind:
Beide stellen die gleiche Schnittstelle bereit.
Mit diesen können Sie erreichen, was Sie wollen:
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'