rupython 1.2.12__py3-none-any.whl → 1.2.14__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rupython/__/342/225/250/320/247/342/225/250/342/226/221/342/225/250/342/224/202/342/225/250/342/225/233/342/225/250/342/225/227/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/225/233/342/225/244/320/227/342/225/250/342/225/234/342/225/244/320/233/342/225/250/342/225/243_/342/225/250/342/225/221/342/225/250/342/225/233/342/225/250/342/224/244__.py +50 -4
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/240/342/225/244/320/221/342/225/250/342/225/225/342/225/250/342/225/234/342/225/244/320/225/342/225/244/320/220.py +100 -100
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/241/342/225/250/320/244.py +56 -56
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/244/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/226/221/342/225/250/320/242/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/235/342/225/244/320/237.py +212 -212
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/247/342/225/250/342/226/221/342/225/250/342/224/220/342/225/244/320/220/342/225/250/342/225/233/342/225/244/320/221/342/225/244/320/233.py +141 -0
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/252/342/225/244/320/223/342/225/244/320/227/342/225/250/342/226/221.py +32 -32
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/252/342/225/250/342/225/233/342/225/250/342/225/227/342/225/250/342/225/227/342/225/250/342/225/241/342/225/250/342/225/221/342/225/244/320/226/342/225/250/342/225/225/342/225/250/342/225/225.py +326 -326
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/254/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/225/241/342/225/250/342/225/235.py +4 -4
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/256/342/225/244/320/227/342/225/250/342/225/241/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/224/244/342/225/244/320/234.py +82 -82
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/257/342/225/250/342/225/233/342/225/244/320/222/342/225/250/342/225/233/342/225/250/342/225/221/342/225/250/342/225/225.py +121 -121
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/260/342/225/250/342/225/241/342/225/250/342/224/202/342/225/250/320/242/342/225/244/320/233/342/225/244/320/220.py +42 -42
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/264/342/225/250/342/226/221/342/225/250/342/225/243/342/225/250/342/225/227/342/225/244/320/233.py +123 -0
- rupython-1.2.14.dist-info/LICENSE +55 -0
- {rupython-1.2.12.dist-info → rupython-1.2.14.dist-info}/METADATA +6 -3
- rupython-1.2.14.dist-info/RECORD +21 -0
- rupython-1.2.12.dist-info/LICENSE +0 -27
- rupython-1.2.12.dist-info/RECORD +0 -19
- {rupython-1.2.12.dist-info → rupython-1.2.14.dist-info}/WHEEL +0 -0
- {rupython-1.2.12.dist-info → rupython-1.2.14.dist-info}/top_level.txt +0 -0
@@ -3,8 +3,8 @@ import math
|
|
3
3
|
Пи = math.pi
|
4
4
|
e = math.e
|
5
5
|
Тау = math.tau
|
6
|
-
|
7
|
-
|
6
|
+
Бесконечность = math.inf
|
7
|
+
Не_число = math.nan
|
8
8
|
|
9
9
|
def Сочетаний(n, k): return math.comb(n, k)
|
10
10
|
def Перестановок(n, k): return math.perm(n, k)
|
@@ -12,8 +12,8 @@ def Факториал(n): return math.factorial(n)
|
|
12
12
|
def НОД(*целые): return math.gcd(*целые)
|
13
13
|
def НОК(*целые): return math.lcm(*целые)
|
14
14
|
def ЦелКвКорень(n): return math.isqrt(n)
|
15
|
-
def
|
16
|
-
def
|
15
|
+
def ЦелВверх(x): return math.ceil(x)
|
16
|
+
def ЦелВниз(x): return math.floor(x)
|
17
17
|
def Модуль(x): return math.fabs(x)
|
18
18
|
def УмножСлож(x, y, z): return math.fma(x, y, z)
|
19
19
|
def Остаток(x, y): return math.fmod(x, y)
|
@@ -18,160 +18,160 @@ from rupython import __Общие_функции__
|
|
18
18
|
}
|
19
19
|
|
20
20
|
class Очередь:
|
21
|
-
def __init__(
|
21
|
+
def __init__(экземпляр, максимальный_размер = 0):
|
22
22
|
kwargs = {'maxsize': максимальный_размер}
|
23
|
-
|
23
|
+
экземпляр._queue = queue.Queue(**kwargs)
|
24
24
|
|
25
|
-
def Добавить(
|
25
|
+
def Добавить(экземпляр, элемент, блоковать = True, таймаут = None):
|
26
26
|
kwargs = {'item': элемент, 'block': блоковать}
|
27
27
|
if таймаут is not None:
|
28
28
|
kwargs['timeout'] = таймаут
|
29
|
-
|
29
|
+
экземпляр._queue.put(**kwargs)
|
30
30
|
|
31
|
-
def Добавить_без_блокования(
|
32
|
-
|
31
|
+
def Добавить_без_блокования(экземпляр, элемент):
|
32
|
+
экземпляр._queue.put_nowait(элемент)
|
33
33
|
|
34
|
-
def Получить(
|
34
|
+
def Получить(экземпляр, блоковать = True, таймаут = None):
|
35
35
|
kwargs = {'block': блоковать}
|
36
36
|
if таймаут is not None:
|
37
37
|
kwargs['timeout'] = таймаут
|
38
|
-
return
|
38
|
+
return экземпляр._queue.get(**kwargs)
|
39
39
|
|
40
|
-
def Получить_без_блокования(
|
41
|
-
return
|
40
|
+
def Получить_без_блокования(экземпляр):
|
41
|
+
return экземпляр._queue.get_nowait()
|
42
42
|
|
43
|
-
def Задача_выполнена(
|
44
|
-
|
43
|
+
def Задача_выполнена(экземпляр):
|
44
|
+
экземпляр._queue.task_done()
|
45
45
|
|
46
|
-
def Ждать_завершения(
|
47
|
-
|
46
|
+
def Ждать_завершения(экземпляр):
|
47
|
+
экземпляр._queue.join()
|
48
48
|
|
49
|
-
def Пустая(
|
50
|
-
return
|
49
|
+
def Пустая(экземпляр):
|
50
|
+
return экземпляр._queue.empty()
|
51
51
|
|
52
|
-
def Полная(
|
53
|
-
return
|
52
|
+
def Полная(экземпляр):
|
53
|
+
return экземпляр._queue.full()
|
54
54
|
|
55
|
-
def Размер(
|
56
|
-
return
|
55
|
+
def Размер(экземпляр):
|
56
|
+
return экземпляр._queue.qsize()
|
57
57
|
|
58
|
-
def __len__(
|
59
|
-
return
|
58
|
+
def __len__(экземпляр):
|
59
|
+
return экземпляр._queue.qsize()
|
60
60
|
|
61
|
-
def __str__(
|
62
|
-
размер =
|
61
|
+
def __str__(экземпляр):
|
62
|
+
размер = экземпляр.Размер()
|
63
63
|
return f"Очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
|
64
64
|
|
65
|
-
def В_строку_с_задачами(
|
66
|
-
размер =
|
65
|
+
def В_строку_с_задачами(экземпляр):
|
66
|
+
размер = экземпляр.Размер()
|
67
67
|
return f"Очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
|
68
68
|
|
69
69
|
class Стековая_очередь:
|
70
|
-
def __init__(
|
70
|
+
def __init__(экземпляр, максимальный_размер = 0):
|
71
71
|
kwargs = {'maxsize': максимальный_размер}
|
72
|
-
|
72
|
+
экземпляр._queue = queue.LifoQueue(**kwargs)
|
73
73
|
|
74
|
-
def Добавить(
|
74
|
+
def Добавить(экземпляр, элемент, блоковать = True, таймаут = None):
|
75
75
|
kwargs = {'item': элемент, 'block': блоковать}
|
76
76
|
if таймаут is not None:
|
77
77
|
kwargs['timeout'] = таймаут
|
78
|
-
|
78
|
+
экземпляр._queue.put(**kwargs)
|
79
79
|
|
80
|
-
def Добавить_без_блокования(
|
81
|
-
|
80
|
+
def Добавить_без_блокования(экземпляр, элемент):
|
81
|
+
экземпляр._queue.put_nowait(элемент)
|
82
82
|
|
83
|
-
def Получить(
|
83
|
+
def Получить(экземпляр, блоковать = True, таймаут = None):
|
84
84
|
kwargs = {'block': блоковать}
|
85
85
|
if таймаут is not None:
|
86
86
|
kwargs['timeout'] = таймаут
|
87
|
-
return
|
87
|
+
return экземпляр._queue.get(**kwargs)
|
88
88
|
|
89
|
-
def Получить_без_блокования(
|
90
|
-
return
|
89
|
+
def Получить_без_блокования(экземпляр):
|
90
|
+
return экземпляр._queue.get_nowait()
|
91
91
|
|
92
|
-
def Задача_выполнена(
|
93
|
-
|
92
|
+
def Задача_выполнена(экземпляр):
|
93
|
+
экземпляр._queue.task_done()
|
94
94
|
|
95
|
-
def Ждать_завершения(
|
96
|
-
|
95
|
+
def Ждать_завершения(экземпляр):
|
96
|
+
экземпляр._queue.join()
|
97
97
|
|
98
|
-
def Пустая(
|
99
|
-
return
|
98
|
+
def Пустая(экземпляр):
|
99
|
+
return экземпляр._queue.empty()
|
100
100
|
|
101
|
-
def Полная(
|
102
|
-
return
|
101
|
+
def Полная(экземпляр):
|
102
|
+
return экземпляр._queue.full()
|
103
103
|
|
104
|
-
def Размер(
|
105
|
-
return
|
104
|
+
def Размер(экземпляр):
|
105
|
+
return экземпляр._queue.qsize()
|
106
106
|
|
107
|
-
def __len__(
|
108
|
-
return
|
107
|
+
def __len__(экземпляр):
|
108
|
+
return экземпляр._queue.qsize()
|
109
109
|
|
110
|
-
def __str__(
|
111
|
-
размер =
|
110
|
+
def __str__(экземпляр):
|
111
|
+
размер = экземпляр.Размер()
|
112
112
|
return f"Стековая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
|
113
113
|
|
114
|
-
def В_строку_с_задачами(
|
115
|
-
размер =
|
114
|
+
def В_строку_с_задачами(экземпляр):
|
115
|
+
размер = экземпляр.Размер()
|
116
116
|
return f"Стековая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
|
117
117
|
|
118
118
|
class Приоритетная_очередь:
|
119
|
-
def __init__(
|
119
|
+
def __init__(экземпляр, максимальный_размер = 0):
|
120
120
|
kwargs = {'maxsize': максимальный_размер}
|
121
|
-
|
121
|
+
экземпляр._queue = queue.PriorityQueue(**kwargs)
|
122
122
|
|
123
|
-
def Добавить(
|
123
|
+
def Добавить(экземпляр, элемент, приоритет, блоковать = True, таймаут = None):
|
124
124
|
kwargs = {'item': (приоритет, элемент), 'block': блоковать}
|
125
125
|
if таймаут is not None:
|
126
126
|
kwargs['timeout'] = таймаут
|
127
|
-
|
127
|
+
экземпляр._queue.put(**kwargs)
|
128
128
|
|
129
|
-
def Добавить_без_блокования(
|
130
|
-
|
129
|
+
def Добавить_без_блокования(экземпляр, элемент, приоритет):
|
130
|
+
экземпляр._queue.put_nowait((приоритет, элемент))
|
131
131
|
|
132
|
-
def Получить(
|
132
|
+
def Получить(экземпляр, блоковать = True, таймаут = None):
|
133
133
|
kwargs = {'block': блоковать}
|
134
134
|
if таймаут is not None:
|
135
135
|
kwargs['timeout'] = таймаут
|
136
|
-
приоритет, элемент =
|
136
|
+
приоритет, элемент = экземпляр._queue.get(**kwargs)
|
137
137
|
return элемент
|
138
138
|
|
139
|
-
def Получить_с_приоритетом(
|
139
|
+
def Получить_с_приоритетом(экземпляр, блоковать = True, таймаут = None):
|
140
140
|
kwargs = {'block': блоковать}
|
141
141
|
if таймаут is not None:
|
142
142
|
kwargs['timeout'] = таймаут
|
143
|
-
return
|
143
|
+
return экземпляр._queue.get(**kwargs)
|
144
144
|
|
145
|
-
def Получить_без_блокования(
|
146
|
-
приоритет, элемент =
|
145
|
+
def Получить_без_блокования(экземпляр):
|
146
|
+
приоритет, элемент = экземпляр._queue.get_nowait()
|
147
147
|
return элемент
|
148
148
|
|
149
|
-
def Получить_без_блокования_с_приоритетом(
|
149
|
+
def Получить_без_блокования_с_приоритетом(экземпляр):
|
150
150
|
"""Возвращает кортеж (приоритет, элемент)."""
|
151
|
-
return
|
151
|
+
return экземпляр._queue.get_nowait()
|
152
152
|
|
153
|
-
def Задача_выполнена(
|
154
|
-
|
153
|
+
def Задача_выполнена(экземпляр):
|
154
|
+
экземпляр._queue.task_done()
|
155
155
|
|
156
|
-
def Ждать_завершения(
|
157
|
-
|
156
|
+
def Ждать_завершения(экземпляр):
|
157
|
+
экземпляр._queue.join()
|
158
158
|
|
159
|
-
def Пустая(
|
160
|
-
return
|
159
|
+
def Пустая(экземпляр):
|
160
|
+
return экземпляр._queue.empty()
|
161
161
|
|
162
|
-
def Полная(
|
163
|
-
return
|
162
|
+
def Полная(экземпляр):
|
163
|
+
return экземпляр._queue.full()
|
164
164
|
|
165
|
-
def Размер(
|
166
|
-
return
|
165
|
+
def Размер(экземпляр):
|
166
|
+
return экземпляр._queue.qsize()
|
167
167
|
|
168
|
-
def __len__(
|
169
|
-
return
|
168
|
+
def __len__(экземпляр):
|
169
|
+
return экземпляр._queue.qsize()
|
170
170
|
|
171
|
-
def __str__(
|
172
|
-
размер =
|
171
|
+
def __str__(экземпляр):
|
172
|
+
размер = экземпляр.Размер()
|
173
173
|
return f"Приоритетная_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
|
174
174
|
|
175
|
-
def В_строку_с_задачами(
|
176
|
-
размер =
|
175
|
+
def В_строку_с_задачами(экземпляр):
|
176
|
+
размер = экземпляр.Размер()
|
177
177
|
return f"Приоритетная_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
|
@@ -26,7 +26,7 @@ from rupython import __Общие_функции__
|
|
26
26
|
}
|
27
27
|
|
28
28
|
class Поток:
|
29
|
-
def __init__(
|
29
|
+
def __init__(экземпляр, цель = None, имя = None, аргументы = (), именовАргументы = None, после_окончания = None):
|
30
30
|
ИА = {}
|
31
31
|
if цель is not None:
|
32
32
|
ИА['target'] = цель
|
@@ -38,227 +38,227 @@ class Поток:
|
|
38
38
|
ИА['kwargs'] = именовАргументы
|
39
39
|
if после_окончания is not None:
|
40
40
|
ИА['daemon'] = после_окончания
|
41
|
-
|
41
|
+
экземпляр._thread = threading.Thread(**ИА)
|
42
42
|
|
43
|
-
def Начать(
|
44
|
-
|
43
|
+
def Начать(экземпляр):
|
44
|
+
экземпляр._thread.start()
|
45
45
|
|
46
|
-
def Ждать(
|
46
|
+
def Ждать(экземпляр, время_ожидания = None):
|
47
47
|
ИА = {}
|
48
48
|
if время_ожидания is not None:
|
49
49
|
ИА['timeout'] = время_ожидания
|
50
|
-
|
50
|
+
экземпляр._thread.join(**kwargs)
|
51
51
|
|
52
|
-
def Живой(
|
53
|
-
return
|
52
|
+
def Живой(экземпляр):
|
53
|
+
return экземпляр._thread.is_alive()
|
54
54
|
|
55
|
-
def Получить_имя(
|
56
|
-
return
|
55
|
+
def Получить_имя(экземпляр):
|
56
|
+
return экземпляр._thread.getName()
|
57
57
|
|
58
|
-
def Установить_имя(
|
59
|
-
|
58
|
+
def Установить_имя(экземпляр, имя):
|
59
|
+
экземпляр._thread.setName(имя)
|
60
60
|
|
61
|
-
def Получить_идентификатор(
|
62
|
-
return
|
61
|
+
def Получить_идентификатор(экземпляр):
|
62
|
+
return экземпляр._thread.ident
|
63
63
|
|
64
|
-
def После_окончания(
|
65
|
-
return
|
64
|
+
def После_окончания(экземпляр):
|
65
|
+
return экземпляр._thread.daemon
|
66
66
|
|
67
|
-
def Установить_после_окончания(
|
68
|
-
|
67
|
+
def Установить_после_окончания(экземпляр, после_окончания):
|
68
|
+
экземпляр._thread.daemon = после_окончания
|
69
69
|
|
70
|
-
def __str__(
|
71
|
-
return f"Поток(имя={
|
70
|
+
def __str__(экземпляр):
|
71
|
+
return f"Поток(имя={экземпляр.Получить_имя()}, живой={экземпляр.Живой()})"
|
72
72
|
|
73
73
|
class Блокование:
|
74
|
-
def __init__(
|
75
|
-
|
74
|
+
def __init__(экземпляр):
|
75
|
+
экземпляр._lock = threading.Lock()
|
76
76
|
|
77
|
-
def Захватить(
|
77
|
+
def Захватить(экземпляр, блоковать = True, время_ожидания = None):
|
78
78
|
ИА = {'block': блоковать}
|
79
79
|
if время_ожидания is not None:
|
80
80
|
ИА['timeout'] = время_ожидания
|
81
|
-
return
|
81
|
+
return экземпляр._lock.acquire(**ИА)
|
82
82
|
|
83
|
-
def Освободить(
|
84
|
-
|
83
|
+
def Освободить(экземпляр):
|
84
|
+
экземпляр._lock.release()
|
85
85
|
|
86
|
-
def Захвачено(
|
87
|
-
return
|
86
|
+
def Захвачено(экземпляр):
|
87
|
+
return экземпляр._lock.locked()
|
88
88
|
|
89
|
-
def __enter__(
|
90
|
-
|
91
|
-
return
|
89
|
+
def __enter__(экземпляр):
|
90
|
+
экземпляр.Захватить()
|
91
|
+
return экземпляр
|
92
92
|
|
93
|
-
def __exit__(
|
94
|
-
|
93
|
+
def __exit__(экземпляр, тип_исключения, значение_исключения, трассировка):
|
94
|
+
экземпляр.Освободить()
|
95
95
|
|
96
|
-
def __str__(
|
97
|
-
return f"Блокование(захвачено={
|
96
|
+
def __str__(экземпляр):
|
97
|
+
return f"Блокование(захвачено={экземпляр.Захвачено()})"
|
98
98
|
|
99
99
|
class Повторное_блокование:
|
100
|
-
def __init__(
|
101
|
-
|
100
|
+
def __init__(экземпляр):
|
101
|
+
экземпляр._rlock = threading.RLock()
|
102
102
|
|
103
|
-
def Захватить(
|
103
|
+
def Захватить(экземпляр, блоковать = True, время_ожидания = None):
|
104
104
|
ИА = {'block': блоковать}
|
105
105
|
if время_ожидания is not None:
|
106
106
|
ИА['timeout'] = время_ожидания
|
107
|
-
return
|
107
|
+
return экземпляр._rlock.acquire(**ИА)
|
108
108
|
|
109
|
-
def Освободить(
|
110
|
-
|
109
|
+
def Освободить(экземпляр):
|
110
|
+
экземпляр._rlock.release()
|
111
111
|
|
112
|
-
def __enter__(
|
113
|
-
|
114
|
-
return
|
112
|
+
def __enter__(экземпляр):
|
113
|
+
экземпляр.Захватить()
|
114
|
+
return экземпляр
|
115
115
|
|
116
|
-
def __exit__(
|
117
|
-
|
116
|
+
def __exit__(экземпляр, тип_исключения, значение_исключения, трассировка):
|
117
|
+
экземпляр.Освободить()
|
118
118
|
|
119
|
-
def __str__(
|
120
|
-
return f"Повторное_блокование(владелец={
|
119
|
+
def __str__(экземпляр):
|
120
|
+
return f"Повторное_блокование(владелец={экземпляр._rlock._owner}, счётчик={экземпляр._rlock._count})"
|
121
121
|
|
122
122
|
class Семафор:
|
123
|
-
def __init__(
|
123
|
+
def __init__(экземпляр, количество = 1):
|
124
124
|
ИА = {'value': количество}
|
125
|
-
|
125
|
+
экземпляр._semaphore = threading.Semaphore(**ИА)
|
126
126
|
|
127
|
-
def Захватить(
|
127
|
+
def Захватить(экземпляр, блоковать = True, время_ожидания = None):
|
128
128
|
ИА = {'block': блоковать}
|
129
129
|
if время_ожидания is not None:
|
130
130
|
ИА['timeout'] = время_ожидания
|
131
|
-
return
|
131
|
+
return экземпляр._semaphore.acquire(**ИА)
|
132
132
|
|
133
|
-
def Освободить(
|
134
|
-
|
133
|
+
def Освободить(экземпляр):
|
134
|
+
экземпляр._semaphore.release()
|
135
135
|
|
136
|
-
def __enter__(
|
137
|
-
|
138
|
-
return
|
136
|
+
def __enter__(экземпляр):
|
137
|
+
экземпляр.Захватить()
|
138
|
+
return экземпляр
|
139
139
|
|
140
|
-
def __exit__(
|
141
|
-
|
140
|
+
def __exit__(экземпляр, тип_исключения, значение_исключения, трассировка):
|
141
|
+
экземпляр.Освободить()
|
142
142
|
|
143
|
-
def __str__(
|
144
|
-
return f"Семафор(ресурсов={
|
143
|
+
def __str__(экземпляр):
|
144
|
+
return f"Семафор(ресурсов={экземпляр._semaphore._value})"
|
145
145
|
|
146
146
|
class Ограниченный_семафор(Семафор):
|
147
|
-
def __init__(
|
147
|
+
def __init__(экземпляр, количество = 1):
|
148
148
|
ИА = {'value': количество}
|
149
|
-
|
149
|
+
экземпляр._semaphore = threading.BoundedSemaphore(**ИА)
|
150
150
|
|
151
151
|
class Событие:
|
152
|
-
def __init__(
|
153
|
-
|
152
|
+
def __init__(экземпляр):
|
153
|
+
экземпляр._event = threading.Event()
|
154
154
|
|
155
|
-
def Установить(
|
156
|
-
|
155
|
+
def Установить(экземпляр):
|
156
|
+
экземпляр._event.set()
|
157
157
|
|
158
|
-
def Сбросить(
|
159
|
-
|
158
|
+
def Сбросить(экземпляр):
|
159
|
+
экземпляр._event.clear()
|
160
160
|
|
161
|
-
def Активно(
|
162
|
-
return
|
161
|
+
def Активно(экземпляр):
|
162
|
+
return экземпляр._event.is_set()
|
163
163
|
|
164
|
-
def Ждать(
|
164
|
+
def Ждать(экземпляр, время_ожидания = None):
|
165
165
|
ИА = {}
|
166
166
|
if время_ожидания is not None:
|
167
167
|
ИА['timeout'] = время_ожидания
|
168
|
-
return
|
168
|
+
return экземпляр._event.wait(**ИА)
|
169
169
|
|
170
|
-
def __str__(
|
171
|
-
return f"Событие(активно={
|
170
|
+
def __str__(экземпляр):
|
171
|
+
return f"Событие(активно={экземпляр.Активно()})"
|
172
172
|
|
173
173
|
class Условие:
|
174
|
-
def __init__(
|
174
|
+
def __init__(экземпляр, блокование = None):
|
175
175
|
ИА = {}
|
176
176
|
if блокование is not None:
|
177
177
|
ИА['lock'] = блокование._lock if isinstance(блокование, (Блокование, Повторное_блокование)) else блокование
|
178
|
-
|
178
|
+
экземпляр._condition = threading.Condition(**ИА)
|
179
179
|
|
180
|
-
def Захватить(
|
181
|
-
return
|
180
|
+
def Захватить(экземпляр):
|
181
|
+
return экземпляр._condition.acquire()
|
182
182
|
|
183
|
-
def Освободить(
|
184
|
-
|
183
|
+
def Освободить(экземпляр):
|
184
|
+
экземпляр._condition.release()
|
185
185
|
|
186
|
-
def Ждать(
|
186
|
+
def Ждать(экземпляр, время_ожидания = None):
|
187
187
|
ИА = {}
|
188
188
|
if время_ожидания is not None:
|
189
189
|
ИА['timeout'] = время_ожидания
|
190
|
-
return
|
190
|
+
return экземпляр._condition.wait(**ИА)
|
191
191
|
|
192
|
-
def Уведомить(
|
192
|
+
def Уведомить(экземпляр, количество = 1):
|
193
193
|
ИА = {'n': количество}
|
194
|
-
|
194
|
+
экземпляр._condition.notify(**ИА)
|
195
195
|
|
196
|
-
def Уведомить_все(
|
197
|
-
|
196
|
+
def Уведомить_все(экземпляр):
|
197
|
+
экземпляр._condition.notify_all()
|
198
198
|
|
199
|
-
def __enter__(
|
200
|
-
|
201
|
-
return
|
199
|
+
def __enter__(экземпляр):
|
200
|
+
экземпляр.Захватить()
|
201
|
+
return экземпляр
|
202
202
|
|
203
|
-
def __exit__(
|
204
|
-
|
203
|
+
def __exit__(экземпляр, тип_исключения, значение_исключения, трассировка):
|
204
|
+
экземпляр.Освободить()
|
205
205
|
|
206
|
-
def __str__(
|
207
|
-
return f"Условие(захвачено={
|
206
|
+
def __str__(экземпляр):
|
207
|
+
return f"Условие(захвачено={экземпляр._condition._is_owned()})"
|
208
208
|
|
209
209
|
class Барьер:
|
210
|
-
def __init__(
|
210
|
+
def __init__(экземпляр, количество, действие = None, время_ожидания = None):
|
211
211
|
ИА = {'parties': количество}
|
212
212
|
if действие is not None:
|
213
213
|
ИА['action'] = действие
|
214
214
|
if время_ожидания is not None:
|
215
215
|
ИА['timeout'] = время_ожидания
|
216
|
-
|
216
|
+
экземпляр._barrier = threading.Barrier(**ИА)
|
217
217
|
|
218
|
-
def Ждать(
|
218
|
+
def Ждать(экземпляр, время_ожидания = None):
|
219
219
|
ИА = {}
|
220
220
|
if время_ожидания is not None:
|
221
221
|
ИА['timeout'] = время_ожидания
|
222
|
-
return
|
222
|
+
return экземпляр._barrier.wait(**ИА)
|
223
223
|
|
224
|
-
def Сбросить(
|
225
|
-
|
224
|
+
def Сбросить(экземпляр):
|
225
|
+
экземпляр._barrier.reset()
|
226
226
|
|
227
|
-
def Прервать(
|
228
|
-
|
227
|
+
def Прервать(экземпляр):
|
228
|
+
экземпляр._barrier.abort()
|
229
229
|
|
230
|
-
def Количество_участников(
|
231
|
-
return
|
230
|
+
def Количество_участников(экземпляр):
|
231
|
+
return экземпляр._barrier.parties
|
232
232
|
|
233
|
-
def Количество_ожидающих(
|
234
|
-
return
|
233
|
+
def Количество_ожидающих(экземпляр):
|
234
|
+
return экземпляр._barrier.n_waiting
|
235
235
|
|
236
|
-
def Сломан(
|
237
|
-
return
|
236
|
+
def Сломан(экземпляр):
|
237
|
+
return экземпляр._barrier.broken
|
238
238
|
|
239
|
-
def __str__(
|
240
|
-
return f"Барьер({__Общие_функции__.Склонение_после_числительного(
|
239
|
+
def __str__(экземпляр):
|
240
|
+
return f"Барьер({__Общие_функции__.Склонение_после_числительного(экземпляр.Количество_ожидающих(), Словарь_склонений['участник'])} из {экземпляр.Количество_участников()})"
|
241
241
|
|
242
242
|
class Таймер(Поток):
|
243
|
-
def __init__(
|
243
|
+
def __init__(экземпляр, интервал, цель, аргументы = (), именовАргументы = None, обратный_вызов = None, аргументыОбрВыз = (), именовАргументыОбрВыз = None):
|
244
244
|
ИА = {'interval': интервал, 'function': цель}
|
245
245
|
if аргументы:
|
246
246
|
ИА['args'] = аргументы
|
247
247
|
if именовАргументы is not None:
|
248
248
|
ИА['kwargs'] = именовАргументы
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
249
|
+
экземпляр._timer = threading.Timer(**ИА)
|
250
|
+
экземпляр._callback = обратный_вызов
|
251
|
+
экземпляр._callback_args = аргументыОбрВыз
|
252
|
+
экземпляр._callback_kwargs = именовАргументыОбрВыз or {}
|
253
253
|
|
254
|
-
def Отменить(
|
255
|
-
|
254
|
+
def Отменить(экземпляр):
|
255
|
+
экземпляр._timer.cancel()
|
256
256
|
|
257
|
-
def Завершён(
|
258
|
-
return
|
257
|
+
def Завершён(экземпляр):
|
258
|
+
return экземпляр._timer.finished.is_set()
|
259
259
|
|
260
|
-
def __str__(
|
261
|
-
return f"Таймер(интервал={
|
260
|
+
def __str__(экземпляр):
|
261
|
+
return f"Таймер(интервал={экземпляр._timer.interval}, завершён={экземпляр.Завершён()})"
|
262
262
|
|
263
263
|
def Текущий_поток():
|
264
264
|
return Поток(цель = lambda: None, имя = threading.current_thread().getName())
|