comparison piecrust/baking/worker.py @ 453:8351a77e13f5

bake: Don't pass the previous record entries to the workers. Workers now load the previous record on their own and find the previous entry in their own copy.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 07 Jul 2015 20:19:54 -0700
parents 838f3964f400
children cb3446be44b7
comparison
equal deleted inserted replaced
452:55026b7bb1bf 453:8351a77e13f5
1 import time 1 import time
2 import logging 2 import logging
3 from piecrust.app import PieCrust 3 from piecrust.app import PieCrust
4 from piecrust.baking.records import BakeRecord, _get_transition_key
4 from piecrust.baking.single import PageBaker, BakingError 5 from piecrust.baking.single import PageBaker, BakingError
5 from piecrust.rendering import ( 6 from piecrust.rendering import (
6 QualifiedPage, PageRenderingContext, render_page_segments) 7 QualifiedPage, PageRenderingContext, render_page_segments)
7 from piecrust.routing import create_route_metadata 8 from piecrust.routing import create_route_metadata
8 from piecrust.sources.base import PageFactory 9 from piecrust.sources.base import PageFactory
12 logger = logging.getLogger(__name__) 13 logger = logging.getLogger(__name__)
13 14
14 15
15 class BakeWorkerContext(object): 16 class BakeWorkerContext(object):
16 def __init__(self, root_dir, sub_cache_dir, out_dir, 17 def __init__(self, root_dir, sub_cache_dir, out_dir,
18 previous_record_path=None,
17 force=False, debug=False): 19 force=False, debug=False):
18 self.root_dir = root_dir 20 self.root_dir = root_dir
19 self.sub_cache_dir = sub_cache_dir 21 self.sub_cache_dir = sub_cache_dir
20 self.out_dir = out_dir 22 self.out_dir = out_dir
23 self.previous_record_path = previous_record_path
21 self.force = force 24 self.force = force
22 self.debug = debug 25 self.debug = debug
26 self.app = None
27 self.previous_record = None
28 self.previous_record_index = None
23 29
24 30
25 class BakeWorker(IWorker): 31 class BakeWorker(IWorker):
26 def __init__(self, ctx): 32 def __init__(self, ctx):
27 self.ctx = ctx 33 self.ctx = ctx
33 app._useSubCacheDir(self.ctx.sub_cache_dir) 39 app._useSubCacheDir(self.ctx.sub_cache_dir)
34 app.env.fs_cache_only_for_main_page = True 40 app.env.fs_cache_only_for_main_page = True
35 app.env.registerTimer("BakeWorker_%d_Total" % self.wid) 41 app.env.registerTimer("BakeWorker_%d_Total" % self.wid)
36 app.env.registerTimer("BakeWorkerInit") 42 app.env.registerTimer("BakeWorkerInit")
37 app.env.registerTimer("JobReceive") 43 app.env.registerTimer("JobReceive")
38 self.app = app 44 self.ctx.app = app
45
46 # Load previous record
47 if self.ctx.previous_record_path:
48 self.ctx.previous_record = BakeRecord.load(
49 self.ctx.previous_record_path)
50 self.ctx.previous_record_index = {}
51 for e in self.ctx.previous_record.entries:
52 key = _get_transition_key(e.path, e.taxonomy_info)
53 self.ctx.previous_record_index[key] = e
39 54
40 # Create the job handlers. 55 # Create the job handlers.
41 job_handlers = { 56 job_handlers = {
42 JOB_LOAD: LoadJobHandler(app, self.ctx), 57 JOB_LOAD: LoadJobHandler(self.ctx),
43 JOB_RENDER_FIRST: RenderFirstSubJobHandler(app, self.ctx), 58 JOB_RENDER_FIRST: RenderFirstSubJobHandler(self.ctx),
44 JOB_BAKE: BakeJobHandler(app, self.ctx)} 59 JOB_BAKE: BakeJobHandler(self.ctx)}
45 for jt, jh in job_handlers.items(): 60 for jt, jh in job_handlers.items():
46 app.env.registerTimer(type(jh).__name__) 61 app.env.registerTimer(type(jh).__name__)
47 self.job_handlers = job_handlers 62 self.job_handlers = job_handlers
48 63
49 app.env.stepTimerSince("BakeWorkerInit", self.work_start_time) 64 app.env.stepTimerSince("BakeWorkerInit", self.work_start_time)
50 65
51 def process(self, job): 66 def process(self, job):
52 handler = self.job_handlers[job['type']] 67 handler = self.job_handlers[job['type']]
53 with self.app.env.timerScope(type(handler).__name__): 68 with self.ctx.app.env.timerScope(type(handler).__name__):
54 return handler.handleJob(job['job']) 69 return handler.handleJob(job['job'])
55 70
56 def getReport(self): 71 def getReport(self):
57 self.app.env.stepTimerSince("BakeWorker_%d_Total" % self.wid, 72 self.ctx.app.env.stepTimerSince("BakeWorker_%d_Total" % self.wid,
58 self.work_start_time) 73 self.work_start_time)
59 return { 74 return {
60 'type': 'timers', 75 'type': 'timers',
61 'data': self.app.env._timers} 76 'data': self.ctx.app.env._timers}
62 77
63 78
64 JOB_LOAD, JOB_RENDER_FIRST, JOB_BAKE = range(0, 3) 79 JOB_LOAD, JOB_RENDER_FIRST, JOB_BAKE = range(0, 3)
65 80
66 81
67 class JobHandler(object): 82 class JobHandler(object):
68 def __init__(self, app, ctx): 83 def __init__(self, ctx):
69 self.app = app
70 self.ctx = ctx 84 self.ctx = ctx
85
86 @property
87 def app(self):
88 return self.ctx.app
71 89
72 def handleJob(self, job): 90 def handleJob(self, job):
73 raise NotImplementedError() 91 raise NotImplementedError()
74 92
75 93
143 logger.exception(ex) 161 logger.exception(ex)
144 return result 162 return result
145 163
146 164
147 class BakeJobHandler(JobHandler): 165 class BakeJobHandler(JobHandler):
148 def __init__(self, app, ctx): 166 def __init__(self, ctx):
149 super(BakeJobHandler, self).__init__(app, ctx) 167 super(BakeJobHandler, self).__init__(ctx)
150 self.page_baker = PageBaker(app, ctx.out_dir, ctx.force) 168 self.page_baker = PageBaker(ctx.app, ctx.out_dir, ctx.force)
151 169
152 def handleJob(self, job): 170 def handleJob(self, job):
153 # Actually bake the page and all its sub-pages to the output folder. 171 # Actually bake the page and all its sub-pages to the output folder.
154 fac = load_factory(self.app, job['factory_info']) 172 fac = load_factory(self.app, job['factory_info'])
155 173
169 result = { 187 result = {
170 'path': fac.path, 188 'path': fac.path,
171 'taxonomy_info': tax_info, 189 'taxonomy_info': tax_info,
172 'sub_entries': None, 190 'sub_entries': None,
173 'errors': None} 191 'errors': None}
174 previous_entry = job['prev_entry']
175 dirty_source_names = job['dirty_source_names'] 192 dirty_source_names = job['dirty_source_names']
193
194 previous_entry = None
195 if self.ctx.previous_record_index is not None:
196 key = _get_transition_key(fac.path, tax_info)
197 previous_entry = self.ctx.previous_record_index.get(key)
198
176 logger.debug("Baking page: %s" % fac.ref_spec) 199 logger.debug("Baking page: %s" % fac.ref_spec)
177 try: 200 try:
178 sub_entries = self.page_baker.bake( 201 sub_entries = self.page_baker.bake(
179 qp, previous_entry, dirty_source_names, tax_info) 202 qp, previous_entry, dirty_source_names, tax_info)
180 result['sub_entries'] = sub_entries 203 result['sub_entries'] = sub_entries