同时运行gevent进程和服务器

4 投票
1 回答
1882 浏览
提问于 2025-04-18 08:26

我想要同时运行一些函数,这些函数不一定是通过路由来处理的(可能是后台服务),同时还要运行应用服务器,应该怎么做呢?

举个例子:

#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'

撰写回答