10
10
)
11
11
from dataclasses import dataclass , field
12
12
from inspect import isawaitable
13
- from threading import Lock , Thread , get_ident
13
+ from threading import Lock , Thread , current_thread , get_ident
14
14
from types import TracebackType
15
15
from typing import (
16
16
Any ,
@@ -454,7 +454,10 @@ def __exit__(
454
454
455
455
@contextmanager
456
456
def start_blocking_portal (
457
- backend : str = "asyncio" , backend_options : dict [str , Any ] | None = None
457
+ backend : str = "asyncio" ,
458
+ backend_options : dict [str , Any ] | None = None ,
459
+ * ,
460
+ name : str | None = None ,
458
461
) -> Generator [BlockingPortal , Any , None ]:
459
462
"""
460
463
Start a new event loop in a new thread and run a blocking portal in its main task.
@@ -463,6 +466,7 @@ def start_blocking_portal(
463
466
464
467
:param backend: name of the backend
465
468
:param backend_options: backend options
469
+ :param name: name of the thread
466
470
:return: a context manager that yields a blocking portal
467
471
468
472
.. versionchanged:: 3.0
@@ -472,6 +476,9 @@ def start_blocking_portal(
472
476
473
477
async def run_portal () -> None :
474
478
async with BlockingPortal () as portal_ :
479
+ if name is None :
480
+ current_thread ().name = f"{ backend } -portal-{ id (portal_ ):x} "
481
+
475
482
future .set_result (portal_ )
476
483
await portal_ .sleep_until_stopped ()
477
484
@@ -486,7 +493,7 @@ def run_blocking_portal() -> None:
486
493
future .set_exception (exc )
487
494
488
495
future : Future [BlockingPortal ] = Future ()
489
- thread = Thread (target = run_blocking_portal , daemon = True )
496
+ thread = Thread (target = run_blocking_portal , daemon = True , name = name )
490
497
thread .start ()
491
498
try :
492
499
cancel_remaining_tasks = False
0 commit comments