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?
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
, thenrun_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:it works, but this needs to edit the code of graphql-core package, is there a better solution?