I'm currently using gevent + gunicorn and I have greenlets everywhere. In some toy examples fapws is not behaving in a cooperative manner with gevent.
One example is that sleep statements don't seem to be yielding the thread in the way I would expect with gevent. Here is a simple example where I yield data via a generator. If you have multiple curls going on at once the sleeps seem to stack across requests.
#!/usr/bin/env python
from gevent import monkey
monkey.patch_all()
from gevent.queue import Queue
from gevent import sleep
from gevent import spawn
import fapws._evwsgi as evwsgi
from fapws import base
class Generator(object):
def __init__(self):
super(Generator, self).__init__()
self.gens = []
spawn(self.forever)
def forever(self):
while True:
for gen, pipe in self.gens:
pipe.put(gen.next())
sleep(0)
def add(self, i=0):
def _serial(i=0):
while True:
yield str(i)
i += 1
sleep(i)
pipe = Queue()
self.gens.append((_serial(), pipe))
return pipe
G = Generator()
def start():
evwsgi.start('0.0.0.0', '8080')
evwsgi.set_base_module(base)
def serial(environ, start_response):
start_response('200 OK', [('Content-Type', 'application/json')])
gen = G.add()
return gen
evwsgi.wsgi_cb(('/serial', serial))
evwsgi.set_debug(0)
evwsgi.run()
if __name__ == '__main__':
start()