Skip to content

Commit 6981307

Browse files
committed
_WindowsAdapter class
1 parent bd55861 commit 6981307

File tree

2 files changed

+25
-23
lines changed

2 files changed

+25
-23
lines changed

scrapy_playwright/handler.py

+23-21
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import concurrent
23
import logging
34
import platform
45
from contextlib import suppress
@@ -48,29 +49,30 @@
4849
if platform.system() == "Windows":
4950
import threading
5051

51-
class Var:
52-
windows_loop = None
53-
windows_thread = None
54-
55-
def windows_get_asyncio_event_loop():
56-
if Var.windows_thread is None:
57-
if Var.windows_loop is None:
58-
Var.windows_loop = asyncio.WindowsProactorEventLoopPolicy().new_event_loop()
59-
asyncio.set_event_loop(Var.windows_loop)
60-
if not Var.windows_loop.is_running():
61-
Var.windows_thread = threading.Thread(
62-
target=Var.windows_loop.run_forever, daemon=True
63-
)
64-
Var.windows_thread.start()
65-
return Var.windows_loop
66-
67-
async def windows_get_result(o):
68-
return asyncio.run_coroutine_threadsafe(o, windows_get_asyncio_event_loop()).result()
69-
70-
def deferred_from_coro(o):
52+
class _WindowsAdapter:
53+
loop = None
54+
thread = None
55+
56+
@classmethod
57+
def get_event_loop(cls) -> asyncio.AbstractEventLoop:
58+
if cls.thread is None:
59+
if cls.loop is None:
60+
policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore
61+
cls.loop = policy.new_event_loop()
62+
asyncio.set_event_loop(cls.loop)
63+
if not cls.loop.is_running():
64+
cls.thread = threading.Thread(target=cls.loop.run_forever, daemon=True)
65+
cls.thread.start()
66+
return cls.loop
67+
68+
@classmethod
69+
async def get_result(cls, o) -> concurrent.futures.Future:
70+
return asyncio.run_coroutine_threadsafe(coro=o, loop=cls.get_event_loop()).result()
71+
72+
def deferred_from_coro(o) -> Deferred:
7173
if isinstance(o, Deferred):
7274
return o
73-
return deferred_from_coro_default(windows_get_result(o))
75+
return deferred_from_coro_default(_WindowsAdapter.get_result(o))
7476

7577
else:
7678
deferred_from_coro = deferred_from_coro_default

tests/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99

1010

1111
if platform.system() == "Windows":
12-
from scrapy_playwright.handler import windows_get_result
12+
from scrapy_playwright.handler import _WindowsAdapter
1313

1414
def windows_pytest_mark_asyncio(pytest_mark_asyncio):
1515
def wrapper(*args, **kwargs):
1616
if args and inspect.iscoroutinefunction(args[0]):
1717

1818
async def method_proxy(*x):
19-
await windows_get_result(args[0](*x))
19+
await _WindowsAdapter.get_result(args[0](*x))
2020

2121
return pytest_mark_asyncio(method_proxy)
2222
return windows_pytest_mark_asyncio(pytest_mark_asyncio(*args, **kwargs))

0 commit comments

Comments
 (0)