Search code examples
gunicornbottlegevent

pybottle gunicorn gevent not sharing global dict


from gevent import monkey
monkey.patch_all()

import bottle

app = bottle.Bottle()
COUNT = 0

@app.route('/inc', method='GET')
def count():
    global COUNT
    COUNT += 1
    return COUNT

def main():
    app.run(
        server="gunicorn",
        host="0.0.0.0",
        port=port,
        workers=50,
        worker_class="gevent",
        debug=False,
        reloader=False,
    )

if __name__ == '__main__':
    main(sys.argv[1:])

when i refresh 0.0.0.0/inc, it is not increasing linearly, it goes to 1 to 0 to 1 to 0 to 2 to 1 to 0, etc

That tells me each thread (gevent worker) maintains COUNT value

how to share global var between all gevent workers?

-- ive confirmed that indeed separate greenlet is keeping track of its own COUNT

INFO:__main__:(<Greenlet at 0x7fcae40bbd00: _handle_and_close_when_done(functools.partial(<bound method GeventWorker.handl, <bound method StreamServer.do_close of <StreamServ, (<gevent._socket3.socket at 0x7fcae256ebe0 object,)>) COUNT 1
INFO:__main__:(<Greenlet at 0x7fcae40bbd00: _handle_and_close_when_done(functools.partial(<bound method GeventWorker.handl, <bound method StreamServer.do_close of <StreamServ, (<gevent._socket3.socket at 0x7fcae256ebe0 object,)>) COUNT 2
INFO:__main__:(<Greenlet at 0x7fcae40bbd00: _handle_and_close_when_done(functools.partial(<bound method GeventWorker.handl, <bound method StreamServer.do_close of <StreamServ, (<gevent._socket3.socket at 0x7fcae256ebe0 object,)>) COUNT 3
INFO:__main__:(<Greenlet at 0x7fcae40bbd00: _handle_and_close_when_done(functools.partial(<bound method GeventWorker.handl, <bound method StreamServer.do_close of <StreamServ, (<gevent._socket3.socket at 0x7fcae256ebe0 object,)>) COUNT 4
INFO:__main__:(<Greenlet at 0x7fcae40bbd00: _handle_and_close_when_done(functools.partial(<bound method GeventWorker.handl, <bound method StreamServer.do_close of <StreamServ, (<gevent._socket3.socket at 0x7fcae409fa00 object,)>) COUNT 1

Solution

  •     app.run(
            server='gevent',
            host="0.0.0.0",
            port=port
        )
    

    removing gunicorn worked for me