3131from scrapy .http .headers import Headers
3232from scrapy .responsetypes import responsetypes
3333from scrapy .settings import Settings
34- from scrapy .utils .defer import deferred_from_coro , maybe_deferred_to_future
34+ from scrapy .utils .defer import deferred_from_coro
3535from scrapy .utils .misc import load_object
3636from scrapy .utils .reactor import verify_installed_reactor
3737from twisted .internet .defer import Deferred , inlineCallbacks
@@ -144,18 +144,21 @@ def __init__(self, crawler: Crawler) -> None:
144144 verify_installed_reactor ("twisted.internet.asyncioreactor.AsyncioSelectorReactor" )
145145 if _SCRAPY_ASYNC_API :
146146 super ().__init__ (crawler = crawler )
147- crawler .signals .connect (self ._launch , signals .engine_started )
148147 else :
149148 super ().__init__ ( # pylint: disable=unexpected-keyword-arg
150149 settings = crawler .settings , crawler = crawler
151150 )
152- crawler .signals .connect (self ._engine_started , signals .engine_started )
153151 self .stats = crawler .stats
154152 self .config = Config .from_settings (crawler .settings )
155153
156154 if self .config .use_threaded_loop :
157155 _ThreadedLoopAdapter .start (id (self ))
158156
157+ if _SCRAPY_ASYNC_API :
158+ crawler .signals .connect (self ._maybe_launch_in_thread , signals .engine_started )
159+ else :
160+ crawler .signals .connect (self ._engine_started , signals .engine_started )
161+
159162 self .browser_launch_lock = asyncio .Lock ()
160163 self .context_launch_lock = asyncio .Lock ()
161164 self .context_wrappers : Dict [str , BrowserContextWrapper ] = {}
@@ -186,10 +189,17 @@ def _deferred_from_coro(self, coro: Awaitable) -> Deferred:
186189 return _ThreadedLoopAdapter ._deferred_from_coro (coro )
187190 return deferred_from_coro (coro )
188191
192+ def _future_from_coro (self , coro : Awaitable ) -> asyncio .Future :
193+ if self .config .use_threaded_loop :
194+ return _ThreadedLoopAdapter ._future_from_coro (coro )
195+ return asyncio .ensure_future (coro )
196+
189197 def _engine_started (self ) -> Deferred :
190- """Launch the browser. Use the engine_started signal as it supports returning deferreds."""
191198 return self ._deferred_from_coro (self ._launch ())
192199
200+ async def _maybe_launch_in_thread (self ) -> None :
201+ await self ._future_from_coro (self ._launch ())
202+
193203 async def _launch (self ) -> None :
194204 """Launch Playwright manager and configured startup context(s)."""
195205 logger .info ("Starting download handler" )
@@ -362,7 +372,7 @@ def _set_max_concurrent_context_count(self):
362372 async def close (self ) -> None :
363373 logger .info ("Closing download handler" )
364374 await super ().close ()
365- await self ._close ()
375+ await self ._future_from_coro ( self . _close () )
366376 if self .config .use_threaded_loop :
367377 _ThreadedLoopAdapter .stop (id (self ))
368378
@@ -392,9 +402,8 @@ async def _close(self) -> None:
392402
393403 async def download_request (self , request : Request ) -> Response :
394404 if request .meta .get ("playwright" ):
395- return await maybe_deferred_to_future (
396- self ._deferred_from_coro (self ._download_request (request , self ._crawler .spider ))
397- )
405+ coro = self ._download_request (request )
406+ return await self ._future_from_coro (coro )
398407 return await super ().download_request ( # pylint: disable=no-value-for-parameter
399408 request
400409 )
@@ -410,7 +419,8 @@ def download_request( # type: ignore[misc] # pylint: disable=invalid-overridden
410419 request = request , spider = spider
411420 )
412421
413- async def _download_request (self , request : Request , spider : Spider ) -> Response :
422+ async def _download_request (self , request : Request , spider : Spider | None = None ) -> Response :
423+ spider = spider or self ._crawler .spider
414424 counter = 0
415425 while True :
416426 try :
0 commit comments