Like :func:`send_catch_log` but supports :ref:`asynchronous signal handlers <signal-deferred>`. Returns a coroutine that completes once all signal handlers have finished. This function requires :class:`~twisted.internet.asyncioreactor.AsyncioSelectorReactor` to be installed.
(
signal: TypingAny = Any,
sender: TypingAny = Anonymous,
*arguments: TypingAny,
**named: TypingAny,
)
| 164 | |
| 165 | |
| 166 | async def _send_catch_log_asyncio( |
| 167 | signal: TypingAny = Any, |
| 168 | sender: TypingAny = Anonymous, |
| 169 | *arguments: TypingAny, |
| 170 | **named: TypingAny, |
| 171 | ) -> list[tuple[TypingAny, TypingAny]]: |
| 172 | """Like :func:`send_catch_log` but supports :ref:`asynchronous signal handlers |
| 173 | <signal-deferred>`. |
| 174 | |
| 175 | Returns a coroutine that completes once all signal handlers have finished. |
| 176 | |
| 177 | This function requires |
| 178 | :class:`~twisted.internet.asyncioreactor.AsyncioSelectorReactor` to be |
| 179 | installed. |
| 180 | |
| 181 | .. versionadded:: 2.14 |
| 182 | """ |
| 183 | dont_log = named.pop("dont_log", ()) |
| 184 | dont_log = tuple(dont_log) if isinstance(dont_log, Sequence) else (dont_log,) |
| 185 | spider = named.get("spider") |
| 186 | handlers: list[Awaitable[TypingAny]] = [] |
| 187 | for receiver in liveReceivers(getAllReceivers(sender, signal)): |
| 188 | |
| 189 | async def handler( |
| 190 | receiver: Callable[..., Any], |
| 191 | ) -> tuple[Callable[..., Any], TypingAny]: |
| 192 | result: TypingAny |
| 193 | try: |
| 194 | result = await ensure_awaitable( |
| 195 | robustApply( |
| 196 | receiver, *arguments, signal=signal, sender=sender, **named |
| 197 | ), |
| 198 | _warn=global_object_name(receiver), |
| 199 | ) |
| 200 | except dont_log as ex: # pylint: disable=catching-non-exception |
| 201 | result = ex |
| 202 | except Exception as ex: |
| 203 | logger.error( |
| 204 | "Error caught on signal handler: %(receiver)s", |
| 205 | {"receiver": receiver}, |
| 206 | exc_info=True, |
| 207 | extra={"spider": spider}, |
| 208 | ) |
| 209 | result = ex |
| 210 | return (receiver, result) |
| 211 | |
| 212 | handlers.append(handler(receiver)) |
| 213 | |
| 214 | return cast( |
| 215 | "list[tuple[TypingAny, TypingAny]]", |
| 216 | await asyncio.gather(*handlers, return_exceptions=True), |
| 217 | ) |
| 218 | |
| 219 | |
| 220 | def disconnect_all(signal: TypingAny = Any, sender: TypingAny = Any) -> None: |
no test coverage detected