3 files changed, 25 insertions, 0 deletions
diff --git a/changelog.d/12135.feature b/changelog.d/12135.feature
new file mode 100644
index 0000000000..b337f51730
--- /dev/null
+++ b/changelog.d/12135.feature
@@ -0,0 +1 @@
+Add experimental env var `SYNAPSE_ASYNC_IO_REACTOR` that causes Synapse to use the asyncio reactor for Twisted.
diff --git a/mypy.ini b/mypy.ini
index 481e8a5366..c8390ddba9 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -353,3 +353,6 @@ ignore_missing_imports = True
[mypy-zope]
ignore_missing_imports = True
+
+[mypy-incremental.*]
+ignore_missing_imports = True
diff --git a/synapse/__init__.py b/synapse/__init__.py
index b21e1ed0f3..674acc7135 100644
--- a/synapse/__init__.py
+++ b/synapse/__init__.py
@@ -25,6 +25,27 @@ if sys.version_info < (3, 7):
print("Synapse requires Python 3.7 or above.")
sys.exit(1)
+# Allow using the asyncio reactor via env var.
+if bool(os.environ.get("SYNAPSE_ASYNC_IO_REACTOR", False)):
+ try:
+ from incremental import Version
+
+ import twisted
+
+ # We need a bugfix that is included in Twisted 21.2.0:
+ # https://twistedmatrix.com/trac/ticket/9787
+ if twisted.version < Version("Twisted", 21, 2, 0):
+ print("Using asyncio reactor requires Twisted>=21.2.0")
+ sys.exit(1)
+
+ import asyncio
+
+ from twisted.internet import asyncioreactor
+
+ asyncioreactor.install(asyncio.get_event_loop())
+ except ImportError:
+ pass
+
# Twisted and canonicaljson will fail to import when this file is executed to
# get the __version__ during a fresh install. That's OK and subsequent calls to
# actually start Synapse will import these libraries fine.
|