david_Yakhin_312 TwoWay 10854
Барлыбай Мади, 311/312 группа TwoWay 10880
t1import asynciot1import asyncio
22
3class Portal:3class Portal:
44
5    def __init__(self, parties):5    def __init__(self, parties):
6        self._parties = parties6        self._parties = parties
7        self._count = parties7        self._count = parties
8        self._topic = None8        self._topic = None
9        self._lock = asyncio.Lock()9        self._lock = asyncio.Lock()
10        self._event = asyncio.Event()10        self._event = asyncio.Event()
11        self._results = [None] * parties11        self._results = [None] * parties
12        self._current_index = 012        self._current_index = 0
1313
14    async def wait(self, topic=None):14    async def wait(self, topic=None):
15        async with self._lock:15        async with self._lock:
16            if self._count <= 0:16            if self._count <= 0:
17                raise RuntimeError('Barrier broken')17                raise RuntimeError('Barrier broken')
18            index = self._current_index18            index = self._current_index
19            self._current_index += 119            self._current_index += 1
20            if topic is not None:20            if topic is not None:
21                if self._topic is None:21                if self._topic is None:
22                    self._topic = topic22                    self._topic = topic
23                elif self._topic != topic:23                elif self._topic != topic:
24                    raise ValueError('Topic mismatch')24                    raise ValueError('Topic mismatch')
25            fut = asyncio.Future()25            fut = asyncio.Future()
26            self._results[index] = fut26            self._results[index] = fut
27            self._count -= 127            self._count -= 1
28            if self._count == 0:28            if self._count == 0:
29                self._event.set()29                self._event.set()
30                for i in range(self._parties):30                for i in range(self._parties):
31                    self._results[i].set_result(i)31                    self._results[i].set_result(i)
32        if index != self._parties - 1:32        if index != self._parties - 1:
33            await self._event.wait()33            await self._event.wait()
34        return await fut34        return await fut
3535
36    async def reset(self):36    async def reset(self):
37        async with self._lock:37        async with self._lock:
38            self._count = self._parties38            self._count = self._parties
39            self._topic = None39            self._topic = None
40            self._event.clear()40            self._event.clear()
41            self._results = [None] * self._parties41            self._results = [None] * self._parties
42            self._current_index = 042            self._current_index = 0
4343
44    @property44    @property
45    def parties(self):45    def parties(self):
46        return self._parties46        return self._parties
4747
48    @property48    @property
49    def n_waiting(self):49    def n_waiting(self):
50        return self._current_index50        return self._current_index
5151
52    @property52    @property
53    def topic(self):53    def topic(self):
54        return self._topic54        return self._topic
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op