|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
| 3 | +from contextlib import AsyncExitStack |
3 | 4 | import pickle
|
4 | 5 | import selectors
|
5 | 6 | from collections import deque
|
@@ -156,7 +157,7 @@ class Socket(zmq.Socket):
|
156 | 157 | _fd = None
|
157 | 158 | _exit_stack = None
|
158 | 159 | _task_group = None
|
159 |
| - __task_group = None |
| 160 | + __stack: AsyncExitStack | None = None |
160 | 161 | _thread = None
|
161 | 162 | started = None
|
162 | 163 | stopped = None
|
@@ -191,6 +192,7 @@ def __init__(
|
191 | 192 | self._exited = Event()
|
192 | 193 | self.stopped = Event()
|
193 | 194 | self._task_group = task_group
|
| 195 | + self.__stack = None |
194 | 196 |
|
195 | 197 | def get(self, key):
|
196 | 198 | result = super().get(key)
|
@@ -831,17 +833,26 @@ async def __aenter__(self) -> Socket:
|
831 | 833 | return
|
832 | 834 |
|
833 | 835 | self._starting = True
|
834 |
| - if self._task_group is None: |
835 |
| - self.__task_group = create_task_group() |
836 |
| - self._task_group = await self.__task_group.__aenter__() |
837 |
| - await self._task_group.start(self._start) |
| 836 | + if self._task_group is not None: |
| 837 | + return self |
| 838 | + |
| 839 | + async with AsyncExitStack() as stack: |
| 840 | + self._task_group = task_group = await stack.enter_async_context( |
| 841 | + create_task_group() |
| 842 | + ) |
| 843 | + await task_group.start(self._start) |
| 844 | + stack.push_async_callback(self.stop) |
| 845 | + self.__stack = stack.pop_all() |
838 | 846 |
|
839 | 847 | return self
|
840 | 848 |
|
841 | 849 | async def __aexit__(self, exc_type, exc_value, exc_tb):
|
| 850 | + if self.__stack is not None: |
| 851 | + try: |
| 852 | + return await self.__stack.__aexit__(exc_type, exc_value, exc_tb) |
| 853 | + finally: |
| 854 | + self.__stack = None |
842 | 855 | await self.stop()
|
843 |
| - if self.__task_group is not None: |
844 |
| - return await self.__task_group.__aexit__(exc_type, exc_value, exc_tb) |
845 | 856 |
|
846 | 857 | async def start(
|
847 | 858 | self,
|
|
0 commit comments