Mercurial > piecrust2
annotate piecrust/workerpool.py @ 1045:2f39ffa601a9
serve: Re-enable baking assets when running the server.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 23 Jan 2018 08:54:27 -0800 |
parents | bd544b65cfad |
children | aa4f1e04cf3e |
rev | line source |
---|---|
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
1 import io |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import sys |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
4 import time |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 import logging |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import threading |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
7 import traceback |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 import multiprocessing |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
9 from piecrust.environment import ExecutionStats |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 logger = logging.getLogger(__name__) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
14 use_fastqueue = False |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
15 use_fastpickle = False |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
16 use_msgpack = False |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
17 use_marshall = False |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
18 use_json = False |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
19 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 class IWorker(object): |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
22 """ Interface for a pool worker. |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
23 """ |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 def initialize(self): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 raise NotImplementedError() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 def process(self, job): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 raise NotImplementedError() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
30 def getStats(self): |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 return None |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
702
c62d83e17abf
bake: Some more optimizations.
Ludovic Chabant <ludovic@chabant.com>
parents:
697
diff
changeset
|
33 def shutdown(self): |
c62d83e17abf
bake: Some more optimizations.
Ludovic Chabant <ludovic@chabant.com>
parents:
697
diff
changeset
|
34 pass |
c62d83e17abf
bake: Some more optimizations.
Ludovic Chabant <ludovic@chabant.com>
parents:
697
diff
changeset
|
35 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
37 def _get_worker_exception_data(wid): |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
38 t, v, tb = sys.exc_info() |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
39 return { |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
40 'wid': wid, |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
41 'type': str(t), |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
42 'value': '\n'.join(_get_errors(v)), |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
43 'traceback': ''.join(traceback.format_exception(t, v, tb)) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
44 } |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
45 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
46 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
47 def _get_errors(ex): |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
48 errors = [] |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
49 while ex is not None: |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
50 msg = str(ex) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
51 errors.append(msg) |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
52 ex = ex.__cause__ |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
53 return errors |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
54 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
55 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 TASK_JOB = 0 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
57 TASK_JOB_BATCH = 1 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
58 TASK_END = 2 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
59 _TASK_ABORT_WORKER = 10 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
60 _CRITICAL_WORKER_ERROR = 11 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 def worker_func(params): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 if params.is_profiling: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 try: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 import cProfile as profile |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 except ImportError: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 import profile |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 params.is_profiling = False |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 name = params.worker_class.__name__ |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 profile.runctx('_real_worker_func(params)', |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 globals(), locals(), |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 filename='%s-%d.prof' % (name, params.wid)) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 else: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 _real_worker_func(params) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 def _real_worker_func(params): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
80 try: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
81 _real_worker_func_unsafe(params) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
82 except Exception as ex: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
83 logger.exception(ex) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
84 msg = ("CRITICAL ERROR IN WORKER %d\n%s" % (params.wid, str(ex))) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
85 params.outqueue.put(( |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
86 _CRITICAL_WORKER_ERROR, None, False, params.wid, msg)) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
87 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
88 |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
89 def _pre_parse_pytest_args(): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
90 # If we are unit-testing, we need to translate our test logging |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
91 # arguments into something Chef can understand. |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
92 import argparse |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
93 parser = argparse.ArgumentParser() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
94 # This is adapted from our `conftest.py`. |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
95 parser.add_argument('--log-debug', action='store_true') |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
96 parser.add_argument('--log-file') |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
97 res, _ = parser.parse_known_args(sys.argv[1:]) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
98 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
99 chef_args = [] |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
100 if res.log_debug: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
101 chef_args.append('--debug') |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
102 if res.log_file: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
103 chef_args += ['--log', res.log_file] |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
104 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
105 root_logger = logging.getLogger() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
106 while len(root_logger.handlers) > 0: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
107 root_logger.removeHandler(root_logger.handlers[0]) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
108 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
109 from piecrust.main import _pre_parse_chef_args |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
110 _pre_parse_chef_args(chef_args) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
111 |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
112 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
113 def _real_worker_func_unsafe(params): |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
114 init_start_time = time.perf_counter() |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
115 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
116 wid = params.wid |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
117 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
118 stats = ExecutionStats() |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
119 stats.registerTimer('WorkerInit') |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
120 |
500
22a230d99621
bake: Fix logging configuration for multi-processing on Windows.
Ludovic Chabant <ludovic@chabant.com>
parents:
462
diff
changeset
|
121 # In a context where `multiprocessing` is using the `spawn` forking model, |
22a230d99621
bake: Fix logging configuration for multi-processing on Windows.
Ludovic Chabant <ludovic@chabant.com>
parents:
462
diff
changeset
|
122 # the new process doesn't inherit anything, so we lost all our logging |
22a230d99621
bake: Fix logging configuration for multi-processing on Windows.
Ludovic Chabant <ludovic@chabant.com>
parents:
462
diff
changeset
|
123 # configuration here. Let's set it up again. |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
124 if (hasattr(multiprocessing, 'get_start_method') and |
566
8073ae8cb164
bake: Don't re-setup logging for workers unless we're sure we need it.
Ludovic Chabant <ludovic@chabant.com>
parents:
500
diff
changeset
|
125 multiprocessing.get_start_method() == 'spawn'): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
126 if not params.is_unit_testing: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
127 from piecrust.main import _pre_parse_chef_args |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
128 _pre_parse_chef_args(sys.argv[1:]) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
129 else: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
130 _pre_parse_pytest_args() |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
131 elif params.is_unit_testing: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
132 _pre_parse_pytest_args() |
500
22a230d99621
bake: Fix logging configuration for multi-processing on Windows.
Ludovic Chabant <ludovic@chabant.com>
parents:
462
diff
changeset
|
133 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
134 from piecrust.main import ColoredFormatter |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
135 root_logger = logging.getLogger() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
136 root_logger.handlers[0].setFormatter(ColoredFormatter( |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
137 ('[W-%d]' % wid) + '[%(name)s] %(message)s')) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
138 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 logger.debug("Worker %d initializing..." % wid) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 |
693
d2a87365b85b
bake: Use threads to read/write from/to the main arbitrator process.
Ludovic Chabant <ludovic@chabant.com>
parents:
691
diff
changeset
|
141 # We don't need those. |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
142 params.inqueue._writer.close() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
143 params.outqueue._reader.close() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
144 |
693
d2a87365b85b
bake: Use threads to read/write from/to the main arbitrator process.
Ludovic Chabant <ludovic@chabant.com>
parents:
691
diff
changeset
|
145 # Initialize the underlying worker class. |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 w = params.worker_class(*params.initargs) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 w.wid = wid |
453
8351a77e13f5
bake: Don't pass the previous record entries to the workers.
Ludovic Chabant <ludovic@chabant.com>
parents:
451
diff
changeset
|
148 try: |
8351a77e13f5
bake: Don't pass the previous record entries to the workers.
Ludovic Chabant <ludovic@chabant.com>
parents:
451
diff
changeset
|
149 w.initialize() |
8351a77e13f5
bake: Don't pass the previous record entries to the workers.
Ludovic Chabant <ludovic@chabant.com>
parents:
451
diff
changeset
|
150 except Exception as ex: |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
151 logger.error("Worker %d failed to initialize." % wid) |
453
8351a77e13f5
bake: Don't pass the previous record entries to the workers.
Ludovic Chabant <ludovic@chabant.com>
parents:
451
diff
changeset
|
152 logger.exception(ex) |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
153 raise |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
155 stats.stepTimerSince('WorkerInit', init_start_time) |
693
d2a87365b85b
bake: Use threads to read/write from/to the main arbitrator process.
Ludovic Chabant <ludovic@chabant.com>
parents:
691
diff
changeset
|
156 |
d2a87365b85b
bake: Use threads to read/write from/to the main arbitrator process.
Ludovic Chabant <ludovic@chabant.com>
parents:
691
diff
changeset
|
157 # Start pumping! |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 completed = 0 |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
159 time_in_get = 0 |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
160 time_in_put = 0 |
1019
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
161 is_first_get = True |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
162 get = params.inqueue.get |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
163 put = params.outqueue.put |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
164 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 while True: |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
166 get_start_time = time.perf_counter() |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
167 task = get() |
1019
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
168 if not is_first_get: |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
169 time_in_get += (time.perf_counter() - get_start_time) |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
170 else: |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
171 is_first_get = False |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 task_type, task_data = task |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
174 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
175 # Job task(s)... just do it. |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
176 if task_type == TASK_JOB or task_type == TASK_JOB_BATCH: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
177 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
178 task_data_list = task_data |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
179 if task_type == TASK_JOB: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
180 task_data_list = [task_data] |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
181 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
182 result_list = [] |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
183 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
184 for td in task_data_list: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
185 try: |
1008
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
186 worker_res = w.process(td) |
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
187 result_list.append((td, worker_res, True)) |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
188 except Exception as e: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
189 logger.debug( |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
190 "Error processing job, sending exception to main process:") |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
191 logger.debug(traceback.format_exc()) |
1019
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
192 error_res = _get_worker_exception_data(wid) |
1008
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
193 result_list.append((td, error_res, False)) |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
194 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
195 res = (task_type, wid, result_list) |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
196 put_start_time = time.perf_counter() |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
197 put(res) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
198 time_in_put += (time.perf_counter() - put_start_time) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
199 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
200 completed += len(task_data_list) |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
201 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
202 # End task... gather stats to send back to the main process. |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
203 elif task_type == TASK_END: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 logger.debug("Worker %d got end task, exiting." % wid) |
1019
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
205 stats.registerTimer('Worker_%d_TaskGet' % wid, time=time_in_get) |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
206 stats.registerTimer('Worker_all_TaskGet', time=time_in_get) |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
207 stats.registerTimer('Worker_%d_ResultPut' % wid, time=time_in_put) |
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
208 stats.registerTimer('Worker_all_ResultPut', time=time_in_put) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 try: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
210 stats.mergeStats(w.getStats()) |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
211 stats_data = stats.toData() |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
212 rep = (task_type, wid, [(task_data, (wid, stats_data), True)]) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 except Exception as e: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
214 logger.debug( |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
215 "Error getting report, sending exception to main process:") |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
216 logger.debug(traceback.format_exc()) |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
217 we = _get_worker_exception_data(wid) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
218 rep = (task_type, wid, [(task_data, (wid, we), False)]) |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
219 put(rep) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 break |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
222 # Emergy abort. |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
223 elif task_type == _TASK_ABORT_WORKER: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
224 logger.debug("Worker %d got abort signal." % wid) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
225 break |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
227 else: |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
228 raise Exception("Unknown task type: %s" % task_type) |
693
d2a87365b85b
bake: Use threads to read/write from/to the main arbitrator process.
Ludovic Chabant <ludovic@chabant.com>
parents:
691
diff
changeset
|
229 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
230 try: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
231 w.shutdown() |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
232 except Exception as e: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
233 logger.error("Worker %s failed to shutdown.") |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
234 logger.exception(e) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
235 raise |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
236 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 logger.debug("Worker %d completed %d tasks." % (wid, completed)) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
240 class _WorkerParams: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 def __init__(self, wid, inqueue, outqueue, worker_class, initargs=(), |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
242 is_profiling=False, is_unit_testing=False): |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 self.wid = wid |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 self.inqueue = inqueue |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 self.outqueue = outqueue |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 self.worker_class = worker_class |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 self.initargs = initargs |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 self.is_profiling = is_profiling |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
249 self.is_unit_testing = is_unit_testing |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
252 class WorkerPool: |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
253 def __init__(self, worker_class, initargs=(), *, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
254 callback=None, error_callback=None, |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
255 worker_count=None, batch_size=None, |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
256 userdata=None): |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
257 init_start_time = time.perf_counter() |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
258 |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
259 stats = ExecutionStats() |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
260 stats.registerTimer('MasterInit') |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
261 self._stats = stats |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
262 self._time_in_put = 0 |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
263 self._time_in_get = 0 |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
264 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
265 self.userdata = userdata |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
266 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 worker_count = worker_count or os.cpu_count() or 1 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
269 if use_fastqueue: |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
270 self._task_queue = FastQueue() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
271 self._result_queue = FastQueue() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
272 self._quick_put = self._task_queue.put |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
273 self._quick_get = self._result_queue.get |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
274 else: |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
275 self._task_queue = multiprocessing.SimpleQueue() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
276 self._result_queue = multiprocessing.SimpleQueue() |
878
313db67cfc35
bake: Use the basic Python queue again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
277 self._quick_put = self._task_queue.put |
313db67cfc35
bake: Use the basic Python queue again.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
278 self._quick_get = self._result_queue.get |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
280 self._callback = callback |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
281 self._error_callback = error_callback |
462
04abc97dd3b6
bake: Add CLI argument to specify job batch size.
Ludovic Chabant <ludovic@chabant.com>
parents:
461
diff
changeset
|
282 self._batch_size = batch_size |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
283 self._jobs_left = 0 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
284 self._lock_jobs_left = threading.Lock() |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
285 self._lock_workers = threading.Lock() |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
286 self._event = threading.Event() |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
287 self._error_on_join = None |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
288 self._closed = False |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 main_module = sys.modules['__main__'] |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 is_profiling = os.path.basename(main_module.__file__) in [ |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
292 'profile.py', 'cProfile.py'] |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
293 is_unit_testing = os.path.basename(main_module.__file__) in [ |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
294 'py.test'] |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 self._pool = [] |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 for i in range(worker_count): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 worker_params = _WorkerParams( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
299 i, self._task_queue, self._result_queue, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
300 worker_class, initargs, |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
301 is_profiling=is_profiling, |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
302 is_unit_testing=is_unit_testing) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 w = multiprocessing.Process(target=worker_func, |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 args=(worker_params,)) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 w.name = w.name.replace('Process', 'PoolWorker') |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 w.daemon = True |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 w.start() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 self._pool.append(w) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 self._result_handler = threading.Thread( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
311 target=WorkerPool._handleResults, |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
312 args=(self,)) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 self._result_handler.daemon = True |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 self._result_handler.start() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
316 stats.stepTimerSince('MasterInit', init_start_time) |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
317 |
1014
071f30aa04bb
bake: Do template caching in a background job if possible.
Ludovic Chabant <ludovic@chabant.com>
parents:
1011
diff
changeset
|
318 @property |
071f30aa04bb
bake: Do template caching in a background job if possible.
Ludovic Chabant <ludovic@chabant.com>
parents:
1011
diff
changeset
|
319 def pool_size(self): |
071f30aa04bb
bake: Do template caching in a background job if possible.
Ludovic Chabant <ludovic@chabant.com>
parents:
1011
diff
changeset
|
320 return len(self._pool) |
071f30aa04bb
bake: Do template caching in a background job if possible.
Ludovic Chabant <ludovic@chabant.com>
parents:
1011
diff
changeset
|
321 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
322 def queueJobs(self, jobs): |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
323 if self._closed: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
324 if self._error_on_join: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
325 raise self._error_on_join |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
326 raise Exception("This worker pool has been closed.") |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
328 jobs = list(jobs) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
329 new_job_count = len(jobs) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
330 if new_job_count > 0: |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
331 put_start_time = time.perf_counter() |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
332 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
333 with self._lock_jobs_left: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
334 self._jobs_left += new_job_count |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
335 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
336 self._event.clear() |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
337 bs = self._batch_size |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
338 if not bs: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
339 for job in jobs: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
340 self._quick_put((TASK_JOB, job)) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
341 else: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
342 cur_offset = 0 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
343 while cur_offset < new_job_count: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
344 next_batch_idx = min(cur_offset + bs, new_job_count) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
345 job_batch = jobs[cur_offset:next_batch_idx] |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
346 self._quick_put((TASK_JOB_BATCH, job_batch)) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
347 cur_offset = next_batch_idx |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
348 |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
349 self._time_in_put += (time.perf_counter() - put_start_time) |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
350 else: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
351 with self._lock_jobs_left: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
352 done = (self._jobs_left == 0) |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
353 if done: |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
354 self._event.set() |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
355 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
356 def wait(self, timeout=None): |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 if self._closed: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 raise Exception("This worker pool has been closed.") |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
360 ret = self._event.wait(timeout) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
361 if self._error_on_join: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
362 raise self._error_on_join |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
363 return ret |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 def close(self): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
366 if self._closed: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
367 raise Exception("This worker pool has been closed.") |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
368 if self._jobs_left > 0: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 raise Exception("A previous job queue has not finished yet.") |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
370 if not self._event.is_set(): |
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
971
diff
changeset
|
371 raise Exception("A previous job queue hasn't been cleared.") |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
373 close_start_time = time.perf_counter() |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 logger.debug("Closing worker pool...") |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
375 live_workers = list(filter(lambda w: w is not None, self._pool)) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
376 handler = _ReportHandler(len(live_workers)) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 self._callback = handler._handle |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
378 self._error_callback = handler._handleError |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
379 for w in live_workers: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 self._quick_put((TASK_END, None)) |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
381 for w in live_workers: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 w.join() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 logger.debug("Waiting for reports...") |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 if not handler.wait(2): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 missing = handler.reports.index(None) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 logger.warning( |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
388 "Didn't receive all worker reports before timeout. " |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
389 "Missing report from worker %d." % missing) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 logger.debug("Exiting result handler thread...") |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 self._result_queue.put(None) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 self._result_handler.join() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 self._closed = True |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
396 stats = self._stats |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
397 stats.registerTimer('MasterTaskPut', time=self._time_in_put) |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
398 stats.registerTimer('MasterResultGet', time=self._time_in_get) |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
399 stats.registerTimer('MasterClose', |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
400 time=(time.perf_counter() - close_start_time)) |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
401 |
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
402 return [stats] + handler.reports |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
404 def _onResultHandlerCriticalError(self, wid): |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
405 logger.error("Result handler received a critical error from " |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
406 "worker %d." % wid) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
407 with self._lock_workers: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
408 self._pool[wid] = None |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
409 if all(map(lambda w: w is None, self._pool)): |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
410 logger.error("All workers have died!") |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
411 self._closed = True |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
412 self._error_on_join = Exception("All workers have died!") |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
413 self._event.set() |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
414 return False |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
415 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
416 return True |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
417 |
1008
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
418 def _onTaskDone(self, done_count): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
419 with self._lock_jobs_left: |
1008
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
420 left = self._jobs_left - done_count |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
421 self._jobs_left = left |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
422 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
423 if left == 0: |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
424 self._event.set() |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
425 |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
426 @staticmethod |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 def _handleResults(pool): |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
428 userdata = pool.userdata |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 while True: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
430 try: |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
431 get_start_time = time.perf_counter() |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
432 res = pool._quick_get() |
1011
c4cf3cfe2726
bake: Better performance stats, and add callback to preload templates.
Ludovic Chabant <ludovic@chabant.com>
parents:
1008
diff
changeset
|
433 pool._time_in_get = (time.perf_counter() - get_start_time) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
434 except (EOFError, OSError): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
435 logger.debug("Result handler thread encountered connection " |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
436 "problem, exiting.") |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
437 return |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
438 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
439 if res is None: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
440 logger.debug("Result handler exiting.") |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
441 return |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
442 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
443 task_type, wid, res_data_list = res |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
444 for res_data in res_data_list: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
445 try: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
446 task_data, data, success = res_data |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
447 if success: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
448 if pool._callback: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
449 pool._callback(task_data, data, userdata) |
451
838f3964f400
bake: Optimize the bake by not using custom classes for passing info.
Ludovic Chabant <ludovic@chabant.com>
parents:
447
diff
changeset
|
450 else: |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
451 if task_type == _CRITICAL_WORKER_ERROR: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
452 logger.error(data) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
453 do_continue = pool._onResultHandlerCriticalError(wid) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
454 if not do_continue: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
455 logger.debug("Aborting result handling thread.") |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
456 return |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
457 else: |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
458 if pool._error_callback: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
459 pool._error_callback(task_data, data, userdata) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
460 else: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
461 logger.error( |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
462 "Worker %d failed to process a job:" % wid) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
463 logger.error(data) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
464 except Exception as ex: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
465 logger.exception(ex) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
466 |
1008
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
467 if task_type == TASK_JOB or task_type == TASK_JOB_BATCH: |
09c3d415d9e5
bake: Make `batch-size` option work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
991
diff
changeset
|
468 pool._onTaskDone(len(res_data_list)) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
469 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
470 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
471 class _ReportHandler: |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
472 def __init__(self, worker_count): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
473 self.reports = [None] * worker_count |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
474 self._count = worker_count |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
475 self._received = 0 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
476 self._lock = threading.Lock() |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
477 self._event = threading.Event() |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
478 |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
479 def wait(self, timeout=None): |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
480 return self._event.wait(timeout) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
481 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
482 def _handle(self, job, res, _): |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
483 wid, data = res |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
484 if wid < 0 or wid > self._count: |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
485 logger.error("Ignoring report from unknown worker %d." % wid) |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
486 return |
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
487 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
488 stats = ExecutionStats() |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
489 stats.fromData(data) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
490 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
491 with self._lock: |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
492 self.reports[wid] = stats |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
493 self._received += 1 |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
494 if self._received == self._count: |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
495 self._event.set() |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
496 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
497 def _handleError(self, job, res, _): |
1019
bd544b65cfad
bake: More detailed stats, and fix a problem with some error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
1014
diff
changeset
|
498 logger.error("Worker %d failed to send its report." % res[0]) |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
499 logger.error(res) |
447
aefe70229fdd
bake: Commonize worker pool code between html and asset baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
500 |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
501 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
502 class FastQueue: |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
503 def __init__(self): |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
504 self._reader, self._writer = multiprocessing.Pipe(duplex=False) |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
505 self._rlock = multiprocessing.Lock() |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
506 self._wlock = multiprocessing.Lock() |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
507 self._initBuffers() |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
508 self._initSerializer() |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
509 |
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
510 def _initBuffers(self): |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
511 self._rbuf = io.BytesIO() |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
512 self._rbuf.truncate(256) |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
513 self._wbuf = io.BytesIO() |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
514 self._wbuf.truncate(256) |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
515 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
516 def _initSerializer(self): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
517 pass |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
518 |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
519 def __getstate__(self): |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
520 return (self._reader, self._writer, self._rlock, self._wlock) |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
521 |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
522 def __setstate__(self, state): |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
523 (self._reader, self._writer, self._rlock, self._wlock) = state |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
524 self._initBuffers() |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
525 |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
526 def get(self): |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
527 with self._rlock: |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
528 self._rbuf.seek(0) |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
529 try: |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
530 with self._rbuf.getbuffer() as b: |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
531 bufsize = self._reader.recv_bytes_into(b) |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
532 except multiprocessing.BufferTooShort as e: |
697
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
533 bufsize = len(e.args[0]) |
9e5393fcfab2
bake: Re-enable faster serialization between processes.
Ludovic Chabant <ludovic@chabant.com>
parents:
693
diff
changeset
|
534 self._rbuf.truncate(bufsize * 2) |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
535 self._rbuf.seek(0) |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
536 self._rbuf.write(e.args[0]) |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
537 |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
538 self._rbuf.seek(0) |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
539 return _unpickle(self, self._rbuf, bufsize) |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
540 |
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
541 def put(self, obj): |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
542 self._wbuf.seek(0) |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
543 _pickle(self, obj, self._wbuf) |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
544 size = self._wbuf.tell() |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
545 |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
546 self._wbuf.seek(0) |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
547 with self._wlock: |
691
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
548 with self._wbuf.getbuffer() as b: |
9ae9390192da
bake: Use standard pickle and queue for now to fix some small issues.
Ludovic Chabant <ludovic@chabant.com>
parents:
687
diff
changeset
|
549 self._writer.send_bytes(b, 0, size) |
461
b015e38d4ee1
internal: Handle data serialization more under the hood.
Ludovic Chabant <ludovic@chabant.com>
parents:
460
diff
changeset
|
550 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
551 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
552 class _BufferWrapper: |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
553 def __init__(self, buf, read_size=0): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
554 self._buf = buf |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
555 self._read_size = read_size |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
556 |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
557 def write(self, data): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
558 self._buf.write(data.encode('utf8')) |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
559 |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
560 def read(self): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
561 return self._buf.read(self._read_size).decode('utf8') |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
562 |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
563 |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
564 if use_fastpickle: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
565 from piecrust import fastpickle |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
566 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
567 def _pickle_fast(queue, obj, buf): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
568 fastpickle.pickle_intob(obj, buf) |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
569 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
570 def _unpickle_fast(queue, buf, bufsize): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
571 return fastpickle.unpickle_fromb(buf, bufsize) |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
572 |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
573 _pickle = _pickle_fast |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
574 _unpickle = _unpickle_fast |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
575 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
576 elif use_msgpack: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
577 import msgpack |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
578 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
579 def _pickle_msgpack(queue, obj, buf): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
580 buf.write(queue._packer.pack(obj)) |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
581 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
582 def _unpickle_msgpack(queue, buf, bufsize): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
583 queue._unpacker.feed(buf.getbuffer()) |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
584 for o in queue._unpacker: |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
585 return o |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
586 # return msgpack.unpack(buf) |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
587 |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
588 def _init_msgpack(queue): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
589 queue._packer = msgpack.Packer() |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
590 queue._unpacker = msgpack.Unpacker() |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
591 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
592 _pickle = _pickle_msgpack |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
593 _unpickle = _unpickle_msgpack |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
594 FastQueue._initSerializer = _init_msgpack |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
595 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
596 elif use_marshall: |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
597 import marshal |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
598 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
599 def _pickle_marshal(queue, obj, buf): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
600 marshal.dump(obj, buf) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
601 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
602 def _unpickle_marshal(queue, buf, bufsize): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
603 return marshal.load(buf) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
604 |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
605 _pickle = _pickle_marshal |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
606 _unpickle = _unpickle_marshal |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
607 |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
608 elif use_json: |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
609 import json |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
610 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
611 def _pickle_json(queue, obj, buf): |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
612 buf = _BufferWrapper(buf) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
613 json.dump(obj, buf, indent=None, separators=(',', ':')) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
614 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
615 def _unpickle_json(queue, buf, bufsize): |
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
616 buf = _BufferWrapper(buf, bufsize) |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
617 return json.load(buf) |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
618 |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
619 _pickle = _pickle_json |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
620 _unpickle = _unpickle_json |
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
979
diff
changeset
|
621 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
622 else: |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
623 import pickle |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
624 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
625 def _pickle_default(queue, obj, buf): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
626 pickle.dump(obj, buf, pickle.HIGHEST_PROTOCOL) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
627 |
991
1857dbd4580f
bake: Fix bugs introduced by bake optimizations, of course.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
628 def _unpickle_default(queue, buf, bufsize): |
971
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
629 return pickle.load(buf) |
5485a11591ec
internal: Worker pool improvements
Ludovic Chabant <ludovic@chabant.com>
parents:
911
diff
changeset
|
630 |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
631 _pickle = _pickle_default |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
702
diff
changeset
|
632 _unpickle = _unpickle_default |