$64 GRAYBYTE WORDPRESS FILE MANAGER $40

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/alt/python37/lib64/python3.7/site-packages/aiohttp/

HOME
Current File : /opt/alt/python37/lib64/python3.7/site-packages/aiohttp//worker.py
"""Async gunicorn worker for aiohttp.web"""

import asyncio
import os
import re
import signal
import sys
from types import FrameType
from typing import Any, Awaitable, Callable, Optional, Union  # noqa

from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat
from gunicorn.workers import base

from aiohttp import web

from .helpers import set_result
from .web_app import Application
from .web_log import AccessLogger

try:
    import ssl

    SSLContext = ssl.SSLContext
except ImportError:  # pragma: no cover
    ssl = None  # type: ignore[assignment]
    SSLContext = object  # type: ignore[misc,assignment]


__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker", "GunicornTokioWebWorker")


class GunicornWebWorker(base.Worker):  # type: ignore[misc,no-any-unimported]

    DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT
    DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default

    def __init__(self, *args: Any, **kw: Any) -> None:  # pragma: no cover
        super().__init__(*args, **kw)

        self._task = None  # type: Optional[asyncio.Task[None]]
        self.exit_code = 0
        self._notify_waiter = None  # type: Optional[asyncio.Future[bool]]

    def init_process(self) -> None:
        # create new event_loop after fork
        asyncio.get_event_loop().close()

        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(self.loop)

        super().init_process()

    def run(self) -> None:
        self._task = self.loop.create_task(self._run())

        try:  # ignore all finalization problems
            self.loop.run_until_complete(self._task)
        except Exception:
            self.log.exception("Exception in gunicorn worker")
        self.loop.run_until_complete(self.loop.shutdown_asyncgens())
        self.loop.close()

        sys.exit(self.exit_code)

    async def _run(self) -> None:
        runner = None
        if isinstance(self.wsgi, Application):
            app = self.wsgi
        elif asyncio.iscoroutinefunction(self.wsgi):
            wsgi = await self.wsgi()
            if isinstance(wsgi, web.AppRunner):
                runner = wsgi
                app = runner.app
            else:
                app = wsgi
        else:
            raise RuntimeError(
                "wsgi app should be either Application or "
                "async function returning Application, got {}".format(self.wsgi)
            )

        if runner is None:
            access_log = self.log.access_log if self.cfg.accesslog else None
            runner = web.AppRunner(
                app,
                logger=self.log,
                keepalive_timeout=self.cfg.keepalive,
                access_log=access_log,
                access_log_format=self._get_valid_log_format(
                    self.cfg.access_log_format
                ),
            )
        await runner.setup()

        ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None

        runner = runner
        assert runner is not None
        server = runner.server
        assert server is not None
        for sock in self.sockets:
            site = web.SockSite(
                runner,
                sock,
                ssl_context=ctx,
                shutdown_timeout=self.cfg.graceful_timeout / 100 * 95,
            )
            await site.start()

        # If our parent changed then we shut down.
        pid = os.getpid()
        try:
            while self.alive:  # type: ignore[has-type]
                self.notify()

                cnt = server.requests_count
                if self.cfg.max_requests and cnt > self.cfg.max_requests:
                    self.alive = False
                    self.log.info("Max requests, shutting down: %s", self)

                elif pid == os.getpid() and self.ppid != os.getppid():
                    self.alive = False
                    self.log.info("Parent changed, shutting down: %s", self)
                else:
                    await self._wait_next_notify()
        except BaseException:
            pass

        await runner.cleanup()

    def _wait_next_notify(self) -> "asyncio.Future[bool]":
        self._notify_waiter_done()

        loop = self.loop
        assert loop is not None
        self._notify_waiter = waiter = loop.create_future()
        self.loop.call_later(1.0, self._notify_waiter_done, waiter)

        return waiter

    def _notify_waiter_done(
        self, waiter: Optional["asyncio.Future[bool]"] = None
    ) -> None:
        if waiter is None:
            waiter = self._notify_waiter
        if waiter is not None:
            set_result(waiter, True)

        if waiter is self._notify_waiter:
            self._notify_waiter = None

    def init_signals(self) -> None:
        # Set up signals through the event loop API.

        self.loop.add_signal_handler(
            signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None
        )

        self.loop.add_signal_handler(
            signal.SIGTERM, self.handle_exit, signal.SIGTERM, None
        )

        self.loop.add_signal_handler(
            signal.SIGINT, self.handle_quit, signal.SIGINT, None
        )

        self.loop.add_signal_handler(
            signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None
        )

        self.loop.add_signal_handler(
            signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None
        )

        self.loop.add_signal_handler(
            signal.SIGABRT, self.handle_abort, signal.SIGABRT, None
        )

        # Don't let SIGTERM and SIGUSR1 disturb active requests
        # by interrupting system calls
        signal.siginterrupt(signal.SIGTERM, False)
        signal.siginterrupt(signal.SIGUSR1, False)
        # Reset signals so Gunicorn doesn't swallow subprocess return codes
        # See: https://github.com/aio-libs/aiohttp/issues/6130
        if sys.version_info < (3, 8):
            # Starting from Python 3.8,
            # the default child watcher is ThreadedChildWatcher.
            # The watcher doesn't depend on SIGCHLD signal,
            # there is no need to reset it.
            signal.signal(signal.SIGCHLD, signal.SIG_DFL)

    def handle_quit(self, sig: int, frame: FrameType) -> None:
        self.alive = False

        # worker_int callback
        self.cfg.worker_int(self)

        # wakeup closing process
        self._notify_waiter_done()

    def handle_abort(self, sig: int, frame: FrameType) -> None:
        self.alive = False
        self.exit_code = 1
        self.cfg.worker_abort(self)
        sys.exit(1)

    @staticmethod
    def _create_ssl_context(cfg: Any) -> "SSLContext":
        """Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        """
        if ssl is None:  # pragma: no cover
            raise RuntimeError("SSL is not supported.")

        ctx = ssl.SSLContext(cfg.ssl_version)
        ctx.load_cert_chain(cfg.certfile, cfg.keyfile)
        ctx.verify_mode = cfg.cert_reqs
        if cfg.ca_certs:
            ctx.load_verify_locations(cfg.ca_certs)
        if cfg.ciphers:
            ctx.set_ciphers(cfg.ciphers)
        return ctx

    def _get_valid_log_format(self, source_format: str) -> str:
        if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT:
            return self.DEFAULT_AIOHTTP_LOG_FORMAT
        elif re.search(r"%\([^\)]+\)", source_format):
            raise ValueError(
                "Gunicorn's style options in form of `%(name)s` are not "
                "supported for the log formatting. Please use aiohttp's "
                "format specification to configure access log formatting: "
                "http://docs.aiohttp.org/en/stable/logging.html"
                "#format-specification"
            )
        else:
            return source_format


class GunicornUVLoopWebWorker(GunicornWebWorker):
    def init_process(self) -> None:
        import uvloop

        # Close any existing event loop before setting a
        # new policy.
        asyncio.get_event_loop().close()

        # Setup uvloop policy, so that every
        # asyncio.get_event_loop() will create an instance
        # of uvloop event loop.
        asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

        super().init_process()


class GunicornTokioWebWorker(GunicornWebWorker):
    def init_process(self) -> None:  # pragma: no cover
        import tokio

        # Close any existing event loop before setting a
        # new policy.
        asyncio.get_event_loop().close()

        # Setup tokio policy, so that every
        # asyncio.get_event_loop() will create an instance
        # of tokio event loop.
        asyncio.set_event_loop_policy(tokio.EventLoopPolicy())

        super().init_process()

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
13 Aug 2025 1.05 AM
root / 996
0755
.hash
--
31 Aug 2024 6.48 AM
root / 996
0755
__pycache__
--
31 Aug 2024 6.48 AM
root / 996
0755
__init__.py
6.709 KB
15 Nov 2021 3.05 AM
root / 996
0644
_cparser.pxd
4.881 KB
15 Nov 2021 3.05 AM
root / 996
0644
_find_header.c
183.174 KB
15 Nov 2021 3.05 AM
root / 996
0644
_find_header.h
0.166 KB
15 Nov 2021 3.05 AM
root / 996
0644
_find_header.pxd
0.066 KB
15 Nov 2021 3.05 AM
root / 996
0644
_headers.pxi
1.96 KB
15 Nov 2021 3.05 AM
root / 996
0644
_helpers.c
207.99 KB
15 Nov 2021 3.05 AM
root / 996
0644
_helpers.cpython-37m-x86_64-linux-gnu.so
66.117 KB
14 Nov 2023 6.36 PM
root / 996
0755
_helpers.pyi
0.197 KB
15 Nov 2021 3.05 AM
root / 996
0644
_helpers.pyx
1.024 KB
15 Nov 2021 3.05 AM
root / 996
0644
_http_parser.c
955.261 KB
15 Nov 2021 3.05 AM
root / 996
0644
_http_parser.cpython-37m-x86_64-linux-gnu.so
523.539 KB
14 Nov 2023 6.36 PM
root / 996
0755
_http_parser.pyx
25.948 KB
15 Nov 2021 3.05 AM
root / 996
0644
_http_writer.c
216.084 KB
15 Nov 2021 3.05 AM
root / 996
0644
_http_writer.cpython-37m-x86_64-linux-gnu.so
61.203 KB
14 Nov 2023 6.36 PM
root / 996
0755
_http_writer.pyx
4.468 KB
15 Nov 2021 3.05 AM
root / 996
0644
_websocket.c
135.176 KB
15 Nov 2021 3.05 AM
root / 996
0644
_websocket.cpython-37m-x86_64-linux-gnu.so
37.367 KB
14 Nov 2023 6.36 PM
root / 996
0755
_websocket.pyx
1.524 KB
15 Nov 2021 3.05 AM
root / 996
0644
abc.py
5.384 KB
15 Nov 2021 3.05 AM
root / 996
0644
base_protocol.py
2.637 KB
15 Nov 2021 3.05 AM
root / 996
0644
client.py
43.873 KB
15 Nov 2021 3.05 AM
root / 996
0644
client_exceptions.py
9.06 KB
15 Nov 2021 3.05 AM
root / 996
0644
client_proto.py
8.004 KB
15 Nov 2021 3.05 AM
root / 996
0644
client_reqrep.py
36.021 KB
15 Nov 2021 3.05 AM
root / 996
0644
client_ws.py
10.293 KB
15 Nov 2021 3.05 AM
root / 996
0644
connector.py
49.662 KB
15 Nov 2021 3.05 AM
root / 996
0644
cookiejar.py
13.252 KB
15 Nov 2021 3.05 AM
root / 996
0644
formdata.py
5.979 KB
15 Nov 2021 3.05 AM
root / 996
0644
hdrs.py
4.613 KB
15 Nov 2021 3.05 AM
root / 996
0644
helpers.py
25.628 KB
15 Nov 2021 3.05 AM
root / 996
0644
http.py
1.781 KB
15 Nov 2021 3.05 AM
root / 996
0644
http_exceptions.py
2.525 KB
15 Nov 2021 3.05 AM
root / 996
0644
http_parser.py
31.826 KB
15 Nov 2021 3.05 AM
root / 996
0644
http_websocket.py
24.765 KB
15 Nov 2021 3.05 AM
root / 996
0644
http_writer.py
5.836 KB
15 Nov 2021 3.05 AM
root / 996
0644
locks.py
1.125 KB
15 Nov 2021 3.05 AM
root / 996
0644
log.py
0.317 KB
15 Nov 2021 3.05 AM
root / 996
0644
multipart.py
31.677 KB
15 Nov 2021 3.05 AM
root / 996
0644
payload.py
13.379 KB
15 Nov 2021 3.05 AM
root / 996
0644
payload_streamer.py
2.063 KB
15 Nov 2021 3.05 AM
root / 996
0644
py.typed
0.007 KB
15 Nov 2021 3.05 AM
root / 996
0644
pytest_plugin.py
11.496 KB
15 Nov 2021 3.05 AM
root / 996
0644
resolver.py
4.973 KB
15 Nov 2021 3.05 AM
root / 996
0644
streams.py
20.352 KB
15 Nov 2021 3.05 AM
root / 996
0644
tcp_helpers.py
0.939 KB
15 Nov 2021 3.05 AM
root / 996
0644
test_utils.py
20.722 KB
15 Nov 2021 3.05 AM
root / 996
0644
tracing.py
14.946 KB
15 Nov 2021 3.05 AM
root / 996
0644
typedefs.py
1.725 KB
15 Nov 2021 3.05 AM
root / 996
0644
web.py
17.509 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_app.py
16.863 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_exceptions.py
9.869 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_fileresponse.py
10.531 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_log.py
7.388 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_middlewares.py
4.04 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_protocol.py
22.02 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_request.py
27.234 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_response.py
26.921 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_routedef.py
5.898 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_runner.py
10.927 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_server.py
2.01 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_urldispatcher.py
38.62 KB
15 Nov 2021 3.05 AM
root / 996
0644
web_ws.py
16.854 KB
15 Nov 2021 3.05 AM
root / 996
0644
worker.py
8.573 KB
15 Nov 2021 3.05 AM
root / 996
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF