graphql-python / graphql-python/graphql-core-legacy
Some troubles using AsyncioExecutor and gunicorn
- 主要言語
- Python
- スター
- 372
- フォーク
- 175
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
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](https://github.com/graphql-python/graphql-core-legacy/blob/master/graphql/execution/executors/asyncio.py#L67) 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:
```python
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?
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
調査の方向性
Read graphql/execution/executors/asyncio.py, especially AsyncioExecutor.wait_until_finished and its loop.run_until_complete call. Reproduce concurrent requests through the Gunicorn setup described in the issue, then determine and test a solution where concurrent requests do not raise RuntimeError: This event loop is already running.
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- graphql, python
- 領域
- api, backend
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 35/100