MCPcopy
hub / github.com/scrapy/scrapy / _send_catch_log_asyncio

Function _send_catch_log_asyncio

scrapy/utils/signal.py:166–217  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

164
165
166async 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
220def disconnect_all(signal: TypingAny = Any, sender: TypingAny = Any) -> None:

Callers 1

send_catch_log_asyncFunction · 0.85

Calls 3

handlerFunction · 0.85
popMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected