graphql-core-legacy icon indicating copy to clipboard operation
graphql-core-legacy copied to clipboard

Some troubles using AsyncioExecutor and gunicorn

Open WincerChan opened this issue 5 years ago • 0 comments

Hello!

My web app has many api (not only have graphql, but also some rest-api), I am using graphql-core 2.3.2 provided AsyncioExecutor as Executor, and use Gunicorn as WSGI server in production.

The problem is when broswer send some requests concurrently , AsyncioExecutor will raise a error: RuntimeError: This event loop is already running.

After my debugging, I found that it was because AsyncioExecutor.wait_until_finished call loop.run_until_complete, then run_until_complete will check current loop if closed or running, and raise the error.

A worker of Gunicorn have some threads, those threads shares a event loop, and when a event loop is running, another concurrently request also call run_until_complete will raise RuntimeError, so they can't work well concurrently.

My solutions is create a event loop in a single thread, then call loop.run_forever(), and rewrite AsyncioExecutor.wait_until_finished as after:

def wait_until_finished(self):
    while self.futures:
        futures = self.futures
        self.futures = []
        # self.loop.run_until_complete(wait(futures))
        asyncio.run_coroutine_threadsafe(wait(futures), self.loop) # I added this line

it works, but this needs to edit the code of graphql-core package, is there a better solution?

WincerChan avatar Sep 15 '20 08:09 WincerChan