{"record":{"id":"2aabca94cd51936b","repo":"aio-libs/aiohttp","slug":"named-pipes-only-available-in-proactor-loop-under-2aabca","errorCode":null,"errorMessage":"Named Pipes only available in proactor loop under windows","messagePattern":"Named Pipes only available in proactor loop under windows","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"aiohttp/web_runner.py","lineNumber":238,"sourceCode":"        server = self._runner.server\n        assert server is not None\n        self._server = await loop.create_unix_server(\n            server,\n            self._path,\n            ssl=self._ssl_context,\n            backlog=self._backlog,\n        )\n\n\nclass NamedPipeSite(BaseSite):\n    __slots__ = (\"_path\",)\n\n    def __init__(self, runner: \"BaseRunner[Any]\", path: str) -> None:\n        loop = asyncio.get_running_loop()\n        if not isinstance(\n            loop, asyncio.ProactorEventLoop  # type: ignore[attr-defined]\n        ):\n            raise RuntimeError(\n                \"Named Pipes only available in proactor loop under windows\"\n            )\n        super().__init__(runner)\n        self._path = path\n\n    @property\n    def name(self) -> str:\n        return self._path\n\n    async def start(self) -> None:\n        await super().start()\n        loop = asyncio.get_running_loop()\n        server = self._runner.server\n        assert server is not None\n        _server = await loop.start_serving_pipe(  # type: ignore[attr-defined]\n            server, self._path\n        )\n        self._server = _server[0]","sourceCodeStart":220,"sourceCodeEnd":256,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/d041d4d0fd48c3f0832084d33be16cf1c4835f85/aiohttp/web_runner.py#L220-L256","documentation":"Raised by NamedPipeSite.__init__ when the running asyncio loop is not a ProactorEventLoop. Windows named pipes rely on the proactor loop's overlapped I/O subsystem; selector loops (the default on Unix, and the UnixSelectorEventLoop on Wine/WSL) cannot service pipe handles, so aiohttp refuses to construct the site.","triggerScenarios":"Constructing `NamedPipeSite(runner, path)` on Linux/macOS, or on Windows under a non-proactor loop (e.g. explicitly set via `asyncio.set_event_loop_policy(asyncio.UnixSelectorEventLoopPolicy())`, or under uvloop which has no proactor).","commonSituations":"Cross-platform code that unconditionally uses NamedPipeSite; running on Unix where named pipes should use UnixSite instead; running under uvloop on Windows (uvloop doesn't exist there but the policy may still mis-set the loop type); containerized deployments on Linux that share code with a Windows service.","solutions":["On Windows, ensure the proactor loop is active: `asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())` at startup.","On Unix, use UnixSite (UDS) instead of NamedPipeSite.","Gate the import/construction by platform: `if os.name == 'nt': NamedPipeSite(...) else: UnixSite(...)`.","Avoid overriding the loop policy to a selector policy when you intend to use named pipes."],"exampleFix":"// before (on Linux)\nsite = NamedPipeSite(runner, r'\\\\.\\pipe\\foo')  # RuntimeError\n\n// after (on Linux)\nsite = UnixSite(runner, '/run/app.sock')\n\n// or on Windows, force proactor loop\nimport asyncio, sys\nif sys.platform == 'win32':\n    asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())\nsite = NamedPipeSite(runner, r'\\\\.\\pipe\\foo')","handlingStrategy":"validation","validationCode":"import sys, asyncio\n\ndef make_named_pipe_site(runner, path):\n    loop = asyncio.get_event_loop()\n    if sys.platform != 'win32' or not isinstance(loop, asyncio.ProactorEventLoop):\n        raise RuntimeError('NamedPipeSite requires Windows ProactorEventLoop')\n    return NamedPipeSite(runner, path)","typeGuard":"import sys, asyncio\n\ndef supports_named_pipe() -> bool:\n    if sys.platform != 'win32':\n        return False\n    loop = asyncio.get_event_loop()\n    return isinstance(loop, asyncio.ProactorEventLoop)","tryCatchPattern":null,"preventionTips":["On Windows, set WindowsProactorEventLoopPolicy at startup before named-pipe use.","On Unix, use UnixSite instead of NamedPipeSite.","Gate NamedPipeSite construction by platform check.","Do not override the loop policy to a selector policy if you need pipes."],"tags":["aiohttp","web-runner","windows","named-pipe","event-loop"],"backgroundTag":null,"analyzedSha":"d041d4d0fd48c3f0832084d33be16cf1c4835f85","analyzedAt":"2026-08-11T20:44:15.550Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}