fluidattacks_core_aio 12.0.0__tar.gz
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.
- fluidattacks_core_aio-12.0.0/.envrc +1 -0
- fluidattacks_core_aio-12.0.0/.gitignore +5 -0
- fluidattacks_core_aio-12.0.0/PKG-INFO +14 -0
- fluidattacks_core_aio-12.0.0/build/default.nix +19 -0
- fluidattacks_core_aio-12.0.0/build/filter.nix +13 -0
- fluidattacks_core_aio-12.0.0/flake.lock +303 -0
- fluidattacks_core_aio-12.0.0/flake.nix +29 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/__init__.py +14 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/processes.py +64 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/py.typed +0 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/runners.py +11 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/tasks.py +213 -0
- fluidattacks_core_aio-12.0.0/fluidattacks_core/aio/threads.py +17 -0
- fluidattacks_core_aio-12.0.0/import-linter.cfg +21 -0
- fluidattacks_core_aio-12.0.0/mypy.ini +32 -0
- fluidattacks_core_aio-12.0.0/pyproject.toml +40 -0
- fluidattacks_core_aio-12.0.0/ruff.toml +45 -0
- fluidattacks_core_aio-12.0.0/tests/__init__.py +0 -0
- fluidattacks_core_aio-12.0.0/tests/test_aio_processes.py +85 -0
- fluidattacks_core_aio-12.0.0/tests/test_aio_tasks.py +191 -0
- fluidattacks_core_aio-12.0.0/uv.lock +723 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
use_flake ".#python311.devShell"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: fluidattacks_core_aio
|
|
3
|
+
Version: 12.0.0
|
|
4
|
+
Summary: Fluid Attacks Core Aio Library
|
|
5
|
+
Author-email: Development <development@fluidattacks.com>
|
|
6
|
+
License: MPL-2.0
|
|
7
|
+
Classifier: Development Status :: 1 - Planning
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Requires-Dist: uvloop>=0.21.0
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{ src, workspace_root }:
|
|
2
|
+
{
|
|
3
|
+
inherit src workspace_root;
|
|
4
|
+
root_path = "develops/fluidattacks-core/python/aio";
|
|
5
|
+
module_name = "fluidattacks_core";
|
|
6
|
+
pypi_token = {
|
|
7
|
+
method = "oidc";
|
|
8
|
+
};
|
|
9
|
+
override = {
|
|
10
|
+
checks = {
|
|
11
|
+
basedpyright = false;
|
|
12
|
+
};
|
|
13
|
+
configs = {
|
|
14
|
+
import_linter = ../import-linter.cfg;
|
|
15
|
+
mypy = ../mypy.ini;
|
|
16
|
+
ruff = ../ruff.toml;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nodes": {
|
|
3
|
+
"flake-parts": {
|
|
4
|
+
"inputs": {
|
|
5
|
+
"nixpkgs-lib": "nixpkgs-lib"
|
|
6
|
+
},
|
|
7
|
+
"locked": {
|
|
8
|
+
"lastModified": 1762810396,
|
|
9
|
+
"narHash": "sha256-dxFVgQPG+R72dkhXTtqUm7KpxElw3u6E+YlQ2WaDgt8=",
|
|
10
|
+
"owner": "hercules-ci",
|
|
11
|
+
"repo": "flake-parts",
|
|
12
|
+
"rev": "0bdadb1b265fb4143a75bd1ec7d8c915898a9923",
|
|
13
|
+
"type": "github"
|
|
14
|
+
},
|
|
15
|
+
"original": {
|
|
16
|
+
"owner": "hercules-ci",
|
|
17
|
+
"repo": "flake-parts",
|
|
18
|
+
"type": "github"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"nix_filter": {
|
|
22
|
+
"locked": {
|
|
23
|
+
"lastModified": 1757882181,
|
|
24
|
+
"narHash": "sha256-+cCxYIh2UNalTz364p+QYmWHs0P+6wDhiWR4jDIKQIU=",
|
|
25
|
+
"owner": "numtide",
|
|
26
|
+
"repo": "nix-filter",
|
|
27
|
+
"rev": "59c44d1909c72441144b93cf0f054be7fe764de5",
|
|
28
|
+
"type": "github"
|
|
29
|
+
},
|
|
30
|
+
"original": {
|
|
31
|
+
"owner": "numtide",
|
|
32
|
+
"repo": "nix-filter",
|
|
33
|
+
"type": "github"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"nixpkgs": {
|
|
37
|
+
"locked": {
|
|
38
|
+
"lastModified": 1758690382,
|
|
39
|
+
"narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
|
|
40
|
+
"owner": "nixos",
|
|
41
|
+
"repo": "nixpkgs",
|
|
42
|
+
"rev": "e643668fd71b949c53f8626614b21ff71a07379d",
|
|
43
|
+
"type": "github"
|
|
44
|
+
},
|
|
45
|
+
"original": {
|
|
46
|
+
"owner": "nixos",
|
|
47
|
+
"ref": "nixos-unstable",
|
|
48
|
+
"repo": "nixpkgs",
|
|
49
|
+
"type": "github"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"nixpkgs-lib": {
|
|
53
|
+
"locked": {
|
|
54
|
+
"lastModified": 1761765539,
|
|
55
|
+
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
|
|
56
|
+
"owner": "nix-community",
|
|
57
|
+
"repo": "nixpkgs.lib",
|
|
58
|
+
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
|
|
59
|
+
"type": "github"
|
|
60
|
+
},
|
|
61
|
+
"original": {
|
|
62
|
+
"owner": "nix-community",
|
|
63
|
+
"repo": "nixpkgs.lib",
|
|
64
|
+
"type": "github"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"nixpkgs_2": {
|
|
68
|
+
"locked": {
|
|
69
|
+
"lastModified": 1758690382,
|
|
70
|
+
"narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
|
|
71
|
+
"owner": "nixos",
|
|
72
|
+
"repo": "nixpkgs",
|
|
73
|
+
"rev": "e643668fd71b949c53f8626614b21ff71a07379d",
|
|
74
|
+
"type": "github"
|
|
75
|
+
},
|
|
76
|
+
"original": {
|
|
77
|
+
"owner": "nixos",
|
|
78
|
+
"ref": "nixos-unstable",
|
|
79
|
+
"repo": "nixpkgs",
|
|
80
|
+
"type": "github"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"nixpkgs_3": {
|
|
84
|
+
"locked": {
|
|
85
|
+
"lastModified": 1761373498,
|
|
86
|
+
"narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
|
|
87
|
+
"owner": "nixos",
|
|
88
|
+
"repo": "nixpkgs",
|
|
89
|
+
"rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
|
|
90
|
+
"type": "github"
|
|
91
|
+
},
|
|
92
|
+
"original": {
|
|
93
|
+
"owner": "nixos",
|
|
94
|
+
"ref": "nixos-unstable",
|
|
95
|
+
"repo": "nixpkgs",
|
|
96
|
+
"type": "github"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"nixpkgs_flake": {
|
|
100
|
+
"locked": {
|
|
101
|
+
"lastModified": 1778253243,
|
|
102
|
+
"narHash": "sha256-KkH2QvU6iRLDTGGEwH5jnMqHWj4zMTuHxi1S1zdr01w=",
|
|
103
|
+
"owner": "nixos",
|
|
104
|
+
"repo": "nixpkgs",
|
|
105
|
+
"rev": "4fcda7103530b23c5ca44286344912082aad4220",
|
|
106
|
+
"type": "github"
|
|
107
|
+
},
|
|
108
|
+
"original": {
|
|
109
|
+
"owner": "nixos",
|
|
110
|
+
"repo": "nixpkgs",
|
|
111
|
+
"type": "github"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"pyproject-build-systems": {
|
|
115
|
+
"inputs": {
|
|
116
|
+
"nixpkgs": "nixpkgs",
|
|
117
|
+
"pyproject-nix": "pyproject-nix",
|
|
118
|
+
"uv2nix": "uv2nix"
|
|
119
|
+
},
|
|
120
|
+
"locked": {
|
|
121
|
+
"lastModified": 1761781027,
|
|
122
|
+
"narHash": "sha256-YDvxPAm2WnxrznRqWwHLjryBGG5Ey1ATEJXrON+TWt8=",
|
|
123
|
+
"owner": "pyproject-nix",
|
|
124
|
+
"repo": "build-system-pkgs",
|
|
125
|
+
"rev": "795a980d25301e5133eca37adae37283ec3c8e66",
|
|
126
|
+
"type": "github"
|
|
127
|
+
},
|
|
128
|
+
"original": {
|
|
129
|
+
"owner": "pyproject-nix",
|
|
130
|
+
"repo": "build-system-pkgs",
|
|
131
|
+
"type": "github"
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"pyproject-nix": {
|
|
135
|
+
"inputs": {
|
|
136
|
+
"nixpkgs": [
|
|
137
|
+
"python_builder",
|
|
138
|
+
"pyproject-build-systems",
|
|
139
|
+
"nixpkgs"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"locked": {
|
|
143
|
+
"lastModified": 1758265079,
|
|
144
|
+
"narHash": "sha256-amLaLNwKSZPShQHzfgmc/9o76dU8xzN0743dWgvYlr8=",
|
|
145
|
+
"owner": "nix-community",
|
|
146
|
+
"repo": "pyproject.nix",
|
|
147
|
+
"rev": "02e9418fd4af638447dca4b17b1280da95527fc9",
|
|
148
|
+
"type": "github"
|
|
149
|
+
},
|
|
150
|
+
"original": {
|
|
151
|
+
"owner": "nix-community",
|
|
152
|
+
"repo": "pyproject.nix",
|
|
153
|
+
"type": "github"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
"pyproject-nix_2": {
|
|
157
|
+
"inputs": {
|
|
158
|
+
"nixpkgs": "nixpkgs_2"
|
|
159
|
+
},
|
|
160
|
+
"locked": {
|
|
161
|
+
"lastModified": 1762427963,
|
|
162
|
+
"narHash": "sha256-CkPlAbIQ87wmjy5qHibfzk4DmMGBNqFer+lLfXjpP5M=",
|
|
163
|
+
"owner": "pyproject-nix",
|
|
164
|
+
"repo": "pyproject.nix",
|
|
165
|
+
"rev": "4540ea004e04fcd12dd2738d51383d10f956f7b9",
|
|
166
|
+
"type": "github"
|
|
167
|
+
},
|
|
168
|
+
"original": {
|
|
169
|
+
"owner": "pyproject-nix",
|
|
170
|
+
"repo": "pyproject.nix",
|
|
171
|
+
"type": "github"
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"pyproject-nix_3": {
|
|
175
|
+
"inputs": {
|
|
176
|
+
"nixpkgs": [
|
|
177
|
+
"python_builder",
|
|
178
|
+
"uv2nix",
|
|
179
|
+
"nixpkgs"
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
"locked": {
|
|
183
|
+
"lastModified": 1760402624,
|
|
184
|
+
"narHash": "sha256-jF6UKLs2uGc2rtved8Vrt58oTWjTQoAssuYs/0578Z4=",
|
|
185
|
+
"owner": "pyproject-nix",
|
|
186
|
+
"repo": "pyproject.nix",
|
|
187
|
+
"rev": "84c4ea102127c77058ea1ed7be7300261fafc7d2",
|
|
188
|
+
"type": "github"
|
|
189
|
+
},
|
|
190
|
+
"original": {
|
|
191
|
+
"owner": "pyproject-nix",
|
|
192
|
+
"repo": "pyproject.nix",
|
|
193
|
+
"type": "github"
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"python_builder": {
|
|
197
|
+
"inputs": {
|
|
198
|
+
"nix_filter": "nix_filter",
|
|
199
|
+
"nixpkgs_flake": "nixpkgs_flake",
|
|
200
|
+
"pyproject-build-systems": "pyproject-build-systems",
|
|
201
|
+
"pyproject-nix": "pyproject-nix_2",
|
|
202
|
+
"shell-helpers": "shell-helpers",
|
|
203
|
+
"uv2nix": "uv2nix_2"
|
|
204
|
+
},
|
|
205
|
+
"locked": {
|
|
206
|
+
"dir": "common/utils/python-builder",
|
|
207
|
+
"lastModified": 1787078362,
|
|
208
|
+
"narHash": "sha256-HYL7Rn6SuNjYxkt/PwFLksZjsauCiY+ENbOWryLsIlw=",
|
|
209
|
+
"ref": "refs/heads/trunk",
|
|
210
|
+
"rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
|
|
211
|
+
"shallow": true,
|
|
212
|
+
"type": "git",
|
|
213
|
+
"url": "ssh://git@gitlab.com/fluidattacks/universe"
|
|
214
|
+
},
|
|
215
|
+
"original": {
|
|
216
|
+
"dir": "common/utils/python-builder",
|
|
217
|
+
"rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
|
|
218
|
+
"shallow": true,
|
|
219
|
+
"type": "git",
|
|
220
|
+
"url": "ssh://git@gitlab.com/fluidattacks/universe"
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
"root": {
|
|
224
|
+
"inputs": {
|
|
225
|
+
"python_builder": "python_builder"
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"shell-helpers": {
|
|
229
|
+
"inputs": {
|
|
230
|
+
"flake-parts": "flake-parts",
|
|
231
|
+
"nixpkgs": [
|
|
232
|
+
"python_builder",
|
|
233
|
+
"nixpkgs_flake"
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
"locked": {
|
|
237
|
+
"dir": "common/utils/shell-helpers",
|
|
238
|
+
"lastModified": 1762806066,
|
|
239
|
+
"narHash": "sha256-Wz99Fl7SpPU1NkTHJ36XOo6DjOEAMXCw3ThRABOS2Hs=",
|
|
240
|
+
"ref": "refs/heads/trunk",
|
|
241
|
+
"rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
|
|
242
|
+
"shallow": true,
|
|
243
|
+
"type": "git",
|
|
244
|
+
"url": "ssh://git@gitlab.com/fluidattacks/universe"
|
|
245
|
+
},
|
|
246
|
+
"original": {
|
|
247
|
+
"dir": "common/utils/shell-helpers",
|
|
248
|
+
"rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
|
|
249
|
+
"shallow": true,
|
|
250
|
+
"type": "git",
|
|
251
|
+
"url": "ssh://git@gitlab.com/fluidattacks/universe"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"uv2nix": {
|
|
255
|
+
"inputs": {
|
|
256
|
+
"nixpkgs": [
|
|
257
|
+
"python_builder",
|
|
258
|
+
"pyproject-build-systems",
|
|
259
|
+
"nixpkgs"
|
|
260
|
+
],
|
|
261
|
+
"pyproject-nix": [
|
|
262
|
+
"python_builder",
|
|
263
|
+
"pyproject-build-systems",
|
|
264
|
+
"pyproject-nix"
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
"locked": {
|
|
268
|
+
"lastModified": 1758933732,
|
|
269
|
+
"narHash": "sha256-HAmm1GBS1myZCFuog0DC2ZLaynvZtiUI2Crmo+cdQI0=",
|
|
270
|
+
"owner": "pyproject-nix",
|
|
271
|
+
"repo": "uv2nix",
|
|
272
|
+
"rev": "273ce18f913d8559e0d04f820d724308966d7c4d",
|
|
273
|
+
"type": "github"
|
|
274
|
+
},
|
|
275
|
+
"original": {
|
|
276
|
+
"owner": "pyproject-nix",
|
|
277
|
+
"repo": "uv2nix",
|
|
278
|
+
"type": "github"
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"uv2nix_2": {
|
|
282
|
+
"inputs": {
|
|
283
|
+
"nixpkgs": "nixpkgs_3",
|
|
284
|
+
"pyproject-nix": "pyproject-nix_3"
|
|
285
|
+
},
|
|
286
|
+
"locked": {
|
|
287
|
+
"lastModified": 1761872265,
|
|
288
|
+
"narHash": "sha256-i25GRgp2vUOebY70L3NTAgkd+Pr1hnn5xM3qHxH0ONU=",
|
|
289
|
+
"owner": "pyproject-nix",
|
|
290
|
+
"repo": "uv2nix",
|
|
291
|
+
"rev": "74dfb62871be152ad3673b143b0cc56105a4f3c5",
|
|
292
|
+
"type": "github"
|
|
293
|
+
},
|
|
294
|
+
"original": {
|
|
295
|
+
"owner": "pyproject-nix",
|
|
296
|
+
"repo": "uv2nix",
|
|
297
|
+
"type": "github"
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"root": "root",
|
|
302
|
+
"version": 7
|
|
303
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
description = "Fluid Attacks Core aio package.";
|
|
3
|
+
|
|
4
|
+
inputs = {
|
|
5
|
+
python_builder = {
|
|
6
|
+
url = "git+ssh://git@gitlab.com/fluidattacks/universe?shallow=1&rev=09fd25a13309eb5e3b5b2a061bb340df3ae5d281&dir=common/utils/python-builder";
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
outputs =
|
|
11
|
+
{ self, ... }@inputs:
|
|
12
|
+
let
|
|
13
|
+
build_args =
|
|
14
|
+
{
|
|
15
|
+
system,
|
|
16
|
+
python_version,
|
|
17
|
+
nixpkgs,
|
|
18
|
+
builders,
|
|
19
|
+
scripts,
|
|
20
|
+
}:
|
|
21
|
+
import ./build {
|
|
22
|
+
src = import ./build/filter.nix nixpkgs.nix-filter self;
|
|
23
|
+
workspace_root = ./.;
|
|
24
|
+
};
|
|
25
|
+
in
|
|
26
|
+
{
|
|
27
|
+
packages = inputs.python_builder.outputs.build build_args;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from fluidattacks_core.aio.processes import to_process
|
|
2
|
+
from fluidattacks_core.aio.runners import run
|
|
3
|
+
from fluidattacks_core.aio.tasks import as_completed, gather, merge_async_generators, to_background
|
|
4
|
+
from fluidattacks_core.aio.threads import to_thread
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"as_completed",
|
|
8
|
+
"gather",
|
|
9
|
+
"merge_async_generators",
|
|
10
|
+
"run",
|
|
11
|
+
"to_background",
|
|
12
|
+
"to_process",
|
|
13
|
+
"to_thread",
|
|
14
|
+
]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import contextvars
|
|
3
|
+
import functools
|
|
4
|
+
import threading
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from concurrent.futures import ProcessPoolExecutor
|
|
7
|
+
from typing import ParamSpec, TypeVar
|
|
8
|
+
|
|
9
|
+
P = ParamSpec("P")
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
|
|
12
|
+
# Single-slot lazy holder, mutated in place so no ``global`` is needed. The
|
|
13
|
+
# pool is created on first use (not at import), so importing this module has no
|
|
14
|
+
# side effects and environments without ``/dev/shm`` (e.g. AWS Lambda) don't
|
|
15
|
+
# crash at import.
|
|
16
|
+
_POOL: dict[None, ProcessPoolExecutor] = {}
|
|
17
|
+
_POOL_LOCK = threading.Lock()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _get_process_pool() -> ProcessPoolExecutor:
|
|
21
|
+
"""Return the shared process pool, creating it on first use.
|
|
22
|
+
|
|
23
|
+
Environments without ``/dev/shm`` (e.g. AWS Lambda) cannot create the
|
|
24
|
+
pool's POSIX semaphores, so we fail explicitly and point the caller to the
|
|
25
|
+
thread-based alternative instead of silently degrading. Creation is guarded
|
|
26
|
+
by a lock so concurrent first callers (e.g. across event loops in separate
|
|
27
|
+
threads) share a single pool.
|
|
28
|
+
"""
|
|
29
|
+
if None not in _POOL:
|
|
30
|
+
with _POOL_LOCK:
|
|
31
|
+
if None not in _POOL:
|
|
32
|
+
try:
|
|
33
|
+
_POOL[None] = ProcessPoolExecutor()
|
|
34
|
+
except OSError as exc:
|
|
35
|
+
msg = (
|
|
36
|
+
"ProcessPoolExecutor is unavailable in this "
|
|
37
|
+
"environment (no /dev/shm, e.g. AWS Lambda). "
|
|
38
|
+
"Use to_thread instead."
|
|
39
|
+
)
|
|
40
|
+
raise RuntimeError(msg) from exc
|
|
41
|
+
return _POOL[None]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Public lazy accessor. ``PROCESS_POOL`` used to be an eagerly-created
|
|
45
|
+
# ProcessPoolExecutor instance; it is now a ``() -> ProcessPoolExecutor``
|
|
46
|
+
# callable built on first call. Callers use ``PROCESS_POOL()``. Changing the
|
|
47
|
+
# type of this public entity is a breaking change, hence the major bump.
|
|
48
|
+
PROCESS_POOL = _get_process_pool
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def to_process(func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
|
|
52
|
+
"""Asynchronously run a function in a separate process.
|
|
53
|
+
|
|
54
|
+
The underlying ProcessPoolExecutor sets a maximum number of worker processes
|
|
55
|
+
based on the number of cores. It is created lazily on first call; in
|
|
56
|
+
environments without ``/dev/shm`` (e.g. AWS Lambda) this raises a
|
|
57
|
+
``RuntimeError`` pointing to ``to_thread``.
|
|
58
|
+
|
|
59
|
+
See: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor
|
|
60
|
+
"""
|
|
61
|
+
loop = asyncio.get_running_loop()
|
|
62
|
+
ctx = contextvars.copy_context()
|
|
63
|
+
func_call = functools.partial(ctx.run, func, *args, **kwargs)
|
|
64
|
+
return await loop.run_in_executor(_get_process_pool(), func_call)
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from collections.abc import Coroutine
|
|
2
|
+
from typing import Any, TypeVar
|
|
3
|
+
|
|
4
|
+
import uvloop
|
|
5
|
+
|
|
6
|
+
T = TypeVar("T")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def run(coroutine: Coroutine[Any, Any, T]) -> T:
|
|
10
|
+
"""Run a coroutine and return the result, using uvloop."""
|
|
11
|
+
return uvloop.run(coroutine)
|