{"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/c0ef574e29109210e96e652771ae4e7b88615fa4/aiohttp/web_runner.py#L220-L256","documentation":"NamedPipeSite relies on loop.start_serving_pipe (line 253), which only exists on asyncio's ProactorEventLoop, and proactor loops only exist on Windows. On Linux/macOS or with the default SelectorEventLoop, the constructor raises RuntimeError at line 235-240.","triggerScenarios":"Constructing `NamedPipeSite(runner, r'\\\\.\\pipe\\foo')` on a non-Windows OS, or on Windows while a custom SelectorEventLoop policy is active.","commonSituations":"Developing on Linux/macOS and using Windows-only NamedPipeSite; setting a SelectorEventLoop policy on Windows; cross-platform code that didn't branch on OS.","solutions":["On Windows, ensure a ProactorEventLoop (default since Python 3.8) is running: asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()).","On non-Windows, do not use NamedPipeSite — use UnixSite (Unix sockets) or TCPSite.","Branch your transport choice by platform (sys.platform == 'win32')."],"exampleFix":"# before (on Linux)\nsite = NamedPipeSite(runner, r'\\\\.\\pipe\\foo')  # raises RuntimeError\n\n# after (on Linux, use unix socket)\nsite = UnixSite(runner, '/tmp/app.sock')","handlingStrategy":"validation","validationCode":"import sys, asyncio\n\ndef make_pipe_site(runner, path):\n    from aiohttp.web import NamedPipeSite, UnixSite\n    if sys.platform != 'win32':\n        return UnixSite(runner, path)  # fallback for non-Windows\n    asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())\n    return NamedPipeSite(runner, path)","typeGuard":"import asyncio\n\ndef supports_named_pipes() -> bool:\n    try:\n        return isinstance(asyncio.get_running_loop(), asyncio.ProactorEventLoop)\n    except RuntimeError:\n        return False","tryCatchPattern":null,"preventionTips":["Use NamedPipeSite only on Windows with a ProactorEventLoop.","Branch transport choice by sys.platform.","On Windows ensure WindowsProactorEventLoopPolicy is set early in main()."],"tags":["server","named-pipe","windows","platform","event-loop"],"analyzedSha":"c0ef574e29109210e96e652771ae4e7b88615fa4","analyzedAt":"2026-08-04T19:51:05.467Z","schemaVersion":2}