同时运行gevent进程和服务器
我想要同时运行一些函数,这些函数不一定是通过路由来处理的(可能是后台服务),同时还要运行应用服务器,应该怎么做呢?
举个例子:
#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'
我是不是需要在main之后这样使用上面的代码?
gevent.joinall(gevent.spawn(alarm))
app.run(....)
或者说
gevent.joinall((gevent.spawn(alarm),gevent.spawn(app.run)))
我的目标是让这些像警报一样的后台服务运行,完成它们的工作后再休息,同时其他服务的操作可以照常进行。服务器也应该同时启动。如果我理解错了,请纠正我。
1 个回答
5
Gevent 自带了自己的 WSGI 服务器,所以其实不需要使用 app.run
。它提供的服务器有:
这两个服务器的功能是一样的。
你可以使用这些服务器来实现你想要的功能:
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'