-
Notifications
You must be signed in to change notification settings - Fork 3
/
multithread_rendering.rb
99 lines (81 loc) · 2.28 KB
/
multithread_rendering.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# frozon_string_literal: true
module Jekyll::UlyssesZhan
end
module Jekyll
module UlyssesZhan::MultithreadRenderingSitePatch
CONCURRENT_JOB_COUNT = 20
Site.prepend self
Site.alias_method :actually_render_regenerated, :render_regenerated
class RenderingJob
def initialize site, document
@site, @document = site, document
end
def run
@thread = Thread.new do
@site.__send__ :actually_render_regenerated, @document, @site.site_payload
end
end
def finished?
!@thread.status
end
end
attr_reader :queue_clear
def render ...
@rendering_jobs = Hash.new { |jobs, priority| jobs[priority] = Set[] }
super
end
def render_regenerated document, _
@rendering_jobs[
case priority_data = document.data['rendering_priority']
when nil then 0
when Numeric then priority_data
when String, Symbol then Plugin::PRIORITIES[priority_data.to_sym]
else raise "Invalid rendering priority: #{priority_data.inspect}"
end
].add RenderingJob.new self, document
end
def render_pages ...
super
@rendering_jobs.sort_by { |priority, _| -priority }.each do |_, jobs|
running = Set.new
while !running.empty? || !jobs.empty?
while running.size < CONCURRENT_JOB_COUNT && (job = jobs.each.first&.tap &:run)
running.add job
jobs.delete job
end
sleep 1
running.delete_if &:finished?
end
end
end
end
module UlyssesZhan::LiquidRendererFilePatch
LiquidRenderer::File.prepend self
def parse content
measure_time { @template = Liquid::Template.parse content, line_numbers: true }
self
end
end
module UlyssesZhan::FeedRenderingPrioirityPatch
JekyllFeed::Generator.prepend self
def make_page ...
super.tap { _1.data['rendering_priority'] = :lowest }
end
end if Jekyll.const_defined? :JekyllFeed
module UlyssesZhan::ArchiveRenderingPriorityPatch
Archives::Archive.prepend self
def initialize ...
super
@data['rendering_priority'] = :lowest
end
end if Jekyll.const_defined? :Archives
module UlyssesZhan::SitemapRenderingPriorityPatch
JekyllSitemap.prepend self
def sitemap ...
super.tap { _1.data['rendering_priority'] = :lowest }
end
def robots ...
super.tap { _1.data['rendering_priority'] = :lowest }
end
end if Jekyll.const_defined? :JekyllSitemap
end