From 32b483d5bcaca6f5e91fbd1c7f111239de72bda2 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 10:33:15 +0900 Subject: [PATCH 01/12] Fix #2134 figure caption with reference causes latex build error --- CHANGES | 2 ++ sphinx/writers/latex.py | 3 ++- tests/roots/test-references-in-caption/conf.py | 4 ++++ tests/roots/test-references-in-caption/index.rst | 8 ++++++++ tests/roots/test-references-in-caption/rimg.png | Bin 0 -> 218 bytes tests/test_build_latex.py | 11 +++++++++++ 6 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-references-in-caption/conf.py create mode 100644 tests/roots/test-references-in-caption/index.rst create mode 100644 tests/roots/test-references-in-caption/rimg.png diff --git a/CHANGES b/CHANGES index e5751c0fb..94a4dd0e4 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ Release 1.3.4 (in development) Bugs fixed ---------- +* #2134 Fix figure caption with reference causes latex build error + Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 5ec86019f..dd77bff17 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1382,7 +1382,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_reference(self, node): for id in node.get('ids'): - self.body += self.hypertarget(id, anchor=True) + anchor = not self.in_caption + self.body += self.hypertarget(id, anchor=anchor) uri = node.get('refuri', '') if not uri and node.get('refid'): uri = '%' + self.curfilestack[-1] + '#' + node['refid'] diff --git a/tests/roots/test-references-in-caption/conf.py b/tests/roots/test-references-in-caption/conf.py new file mode 100644 index 000000000..cf05c9b5c --- /dev/null +++ b/tests/roots/test-references-in-caption/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +html_theme = 'classic' diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst new file mode 100644 index 000000000..aaa0aeef1 --- /dev/null +++ b/tests/roots/test-references-in-caption/index.rst @@ -0,0 +1,8 @@ +test-reference +============== + +.. figure:: rimg.png + + This is the figure caption with a reference to [AuthorYear]_. + +.. [AuthorYear] Author, Title, Year diff --git a/tests/roots/test-references-in-caption/rimg.png b/tests/roots/test-references-in-caption/rimg.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)* Date: Thu, 3 Dec 2015 11:39:25 +0900 Subject: [PATCH 02/12] Fix section and table titles with reference cause latex build error --- sphinx/writers/latex.py | 7 ++++--- tests/roots/test-references-in-caption/index.rst | 12 ++++++++++++ tests/test_build_latex.py | 4 +++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index dd77bff17..2164e14c1 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1381,9 +1381,10 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode def visit_reference(self, node): - for id in node.get('ids'): - anchor = not self.in_caption - self.body += self.hypertarget(id, anchor=anchor) + if not self.in_title: + for id in node.get('ids'): + anchor = not self.in_caption + self.body += self.hypertarget(id, anchor=anchor) uri = node.get('refuri', '') if not uri and node.get('refid'): uri = '%' + self.curfilestack[-1] + '#' + node['refid'] diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst index aaa0aeef1..f71a7b8f4 100644 --- a/tests/roots/test-references-in-caption/index.rst +++ b/tests/roots/test-references-in-caption/index.rst @@ -1,8 +1,20 @@ +============== test-reference ============== +The section with a reference to [AuthorYear]_ +============================================= + .. figure:: rimg.png This is the figure caption with a reference to [AuthorYear]_. +.. list-table:: The table title with a reference to [AuthorYear]_ + :header-rows: 1 + + * - Header1 + - Header2 + * - Content + - Content + .. [AuthorYear] Author, Title, Year diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 067671f7e..77b8dd731 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -327,5 +327,7 @@ def test_reference_in_caption(app, status, warning): print(result) print(status.getvalue()) print(warning.getvalue()) - assert ('\\caption{This is the figure caption with a reference to \\label{index:id1}' + assert ('\\caption{This is the figure caption with a reference to \\label{index:id2}' '{\\hyperref[index:authoryear]{\\emph{{[}AuthorYear{]}}}}.}' in result) + assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result + assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result From 8648bdeec1daa6342ff2570ed556d51c16877070 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 14:48:00 +0900 Subject: [PATCH 03/12] Fix #2094 rubric with reference not working in Latex --- CHANGES | 1 + sphinx/writers/latex.py | 2 ++ tests/roots/test-references-in-caption/index.rst | 2 ++ tests/test_build_latex.py | 1 + 4 files changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 94a4dd0e4..322f39a64 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ Bugs fixed ---------- * #2134 Fix figure caption with reference causes latex build error +* #2094 Fix rubric with reference not working in Latex Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 2164e14c1..0edc6dd83 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -749,8 +749,10 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode self.body.append('\\paragraph{') self.context.append('}\n') + self.in_title = 1 def depart_rubric(self, node): + self.in_title = 0 self.body.append(self.context.pop()) def visit_footnote(self, node): diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst index f71a7b8f4..decec1bad 100644 --- a/tests/roots/test-references-in-caption/index.rst +++ b/tests/roots/test-references-in-caption/index.rst @@ -17,4 +17,6 @@ The section with a reference to [AuthorYear]_ * - Content - Content +.. rubric:: The rubric title with a reference to [AuthorYear]_ + .. [AuthorYear] Author, Title, Year diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 77b8dd731..be8b7b604 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -331,3 +331,4 @@ def test_reference_in_caption(app, status, warning): '{\\hyperref[index:authoryear]{\\emph{{[}AuthorYear{]}}}}.}' in result) assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result + assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result From aa475604dc89a5c5f5477bd3f58a2afac49422ad Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 23:31:54 +0900 Subject: [PATCH 04/12] ``figure_align`` is added at 1.3 --- doc/config.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/config.rst b/doc/config.rst index 552471f54..b48d59616 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -1431,6 +1431,8 @@ These options influence LaTeX output. 'floated' into the next page but may be preceded by any other text. If you don't like this behavior, use 'H' which will disable floating and position figures strictly in the order they appear in the source. + + .. versionadded:: 1.3 ``'footer'`` Additional footer content (before the indices), default empty. From 5bd8930fec9bcd6b74b32f3b862d18602a4d7f48 Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Sun, 6 Dec 2015 13:31:17 +0900 Subject: [PATCH 05/12] tiny fix --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 322f39a64..d1ed209cd 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Release 1.3.4 (in development) Bugs fixed ---------- -* #2134 Fix figure caption with reference causes latex build error -* #2094 Fix rubric with reference not working in Latex +* #2134: Fix figure caption with reference causes latex build error +* #2094: Fix rubric with reference not working in Latex Release 1.3.3 (released Dec 2, 2015) From 024a3f701ee7dc246fa586b3bd440d4e1a28295c Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Wed, 9 Dec 2015 18:29:46 +0900 Subject: [PATCH 06/12] fix CHANGES --- CHANGES | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index d1ed209cd..e26e817dd 100644 --- a/CHANGES +++ b/CHANGES @@ -61,10 +61,7 @@ Bugs fixed * #1942: Fix a KeyError in websupport. * #1903: Fix strange id generation for glossary terms. * #1796, On py3, automated .mo building cause UnicodeDecodeError -* Fix: ``make text`` will crush if a definition list item has more than 1 classifiers as: -* #1796: On py3, automated .mo building cause UnicodeDecodeError * ``make text`` will crush if a definition list item has more than 1 classifiers as: -* Fixed #1855: make gettext generates broken po file for definition lists with classifier. ``term : classifier1 : classifier2``. * #1855: make gettext generates broken po file for definition lists with classifier. * #1869: Fix problems when dealing with files containing non-ASCII characters. Thanks to @@ -79,6 +76,8 @@ Bugs fixed * #1994: More supporting non-standard parser (like recommonmark parser) for Translation and WebSupport feature. Now node.rawsource is fall backed to node.astext() during docutils transforming. +* #1989: "make blahblah" on Windows indicate help messages for sphinx-build every time. + It was caused by wrong make.bat that generated by Sphinx-1.3.0/1.3.1. * On Py2 environment, conf.py that is generated by sphinx-quickstart should have u prefixed config value for 'version' and 'release'. * #2102: On Windows + Py3, using ``|today|`` and non-ASCII date format will raise From a1240d2cab57aaef1b517a6a9a127a0c48fb8bd8 Mon Sep 17 00:00:00 2001 From: Takaaki AOKI Date: Fri, 4 Dec 2015 13:23:27 +0900 Subject: [PATCH 07/12] resolve issue #2147 Replace legacy float by newfloat package to allow page-break within literal-block environment. capt-of and needspace packages are additionally required. reference: http://tex.stackexchange.com/questions/175650/how-to-allow-page-break-inside-a-float-environment --- sphinx/texinputs/sphinx.sty | 17 ++++++++++++----- sphinx/writers/latex.py | 14 +++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index b28b204bc..03525faec 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -524,11 +524,18 @@ \fi % Define literal-block environment -\RequirePackage{float} -\floatstyle{plaintop} +\RequirePackage{newfloat} +\DeclareFloatingEnvironment{literal-block} \ifx\thechapter\undefined - \newfloat{literal-block}{htbp}{loc}[section] + \SetupFloatingEnvironment{literal-block}{within=section,placement=h} \else - \newfloat{literal-block}{htbp}{loc}[chapter] + \SetupFloatingEnvironment{literal-block}{within=chapter,placement=h} \fi -\floatname{literal-block}{List} +\SetupFloatingEnvironment{literal-block}{name=List} +% control caption around literal-block +\RequirePackage{capt-of} +\RequirePackage{needspace} +% if the left page space is less than \literalblockneedsapce, insert page-break +\newcommand{\literalblockneedspace}{5\baselineskip} +% margin before the caption of literal-block +\newcommand{\literalblockcaptiontopvspace}{0.5\baselineskip} diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 0edc6dd83..291bedbab 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -296,6 +296,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.in_production_list = 0 self.in_footnote = 0 self.in_caption = 0 + self.in_container_literal_block = 0 self.first_document = 1 self.this_is_the_title = 1 self.literal_whitespace = 0 @@ -400,7 +401,7 @@ class LaTeXTranslator(nodes.NodeVisitor): if len(codeblock) == 1: pass # FIXME else: - ret.append('\\floatname{literal-block}{%s}\n' % + ret.append('\\SetupFloatingEnvironment{literal-block}{name=%s}\n' % text_type(codeblock[0]).translate(tex_escape_map)) if table[1]: pass # FIXME @@ -1222,6 +1223,11 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_caption(self, node): self.in_caption += 1 + if self.in_container_literal_block: + self.body.append('\\needspace{\\literalblockneedspace}') + self.body.append('\\vspace{\\literalblockcaptiontopvspace}') + self.body.append('\\captionof{literal-block}{') + return self.body.append('\\caption{') def depart_caption(self, node): @@ -1774,17 +1780,19 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_container(self, node): if node.get('literal_block'): + self.in_container_literal_block += 1 ids = '' for id in self.next_literal_ids: ids += self.hypertarget(id, anchor=False) if node['ids']: ids += self.hypertarget(node['ids'][0]) self.next_literal_ids.clear() - self.body.append('\n\\begin{literal-block}\n') - self.context.append(ids + '\n\\end{literal-block}\n') + self.body.append('\n') + self.context.append(ids + '\n') def depart_container(self, node): if node.get('literal_block'): + self.in_container_literal_block -= 1 self.body.append(self.context.pop()) def visit_decoration(self, node): From 07ed539ad3ef95dbfbdf8546131ea21ea7d23cf3 Mon Sep 17 00:00:00 2001 From: Takaaki AOKI Date: Fri, 4 Dec 2015 20:13:13 +0900 Subject: [PATCH 08/12] modify test strings to be found after build_latex --- tests/test_build_latex.py | 10 +++++----- tests/test_directive_code.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index be8b7b604..4b4eadbf5 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -168,7 +168,7 @@ def test_numref(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table }}' in result - assert '\\floatname{literal-block}{Listing }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Listing }' in result assert '\\hyperref[index:fig1]{Fig. \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Table \\ref{index:table-1}}' in result @@ -190,7 +190,7 @@ def test_numref_with_prefix1(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Figure:}}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Tab\\_}}' in result - assert '\\floatname{literal-block}{Code-}' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Code-}' in result assert '\\ref{index:fig1}' in result assert '\\ref{baz:fig22}' in result assert '\\ref{index:table-1}' in result @@ -220,7 +220,7 @@ def test_numref_with_prefix2(app, status, warning): assert '\\def\\fnum@figure{\\figurename\\thefigure.}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Tab\\_}}' in result assert '\\def\\fnum@table{\\tablename\\thetable:}' in result - assert '\\floatname{literal-block}{Code-}' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Code-}' in result assert '\\hyperref[index:fig1]{Figure:\\ref{index:fig1}.}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Tab\\_\\ref{index:table-1}:}' in result @@ -239,7 +239,7 @@ def test_numref_with_language_el(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsgreek{\\renewcommand{\\figurename}{Fig. }}' in result assert '\\addto\\captionsgreek{\\renewcommand{\\tablename}{Table }}' in result - assert '\\floatname{literal-block}{Listing }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Listing }' in result assert '\\hyperref[index:fig1]{Fig. \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Table \\ref{index:table-1}}' in result @@ -258,7 +258,7 @@ def test_numref_with_language_ja(app, status, warning): print(warning.getvalue()) assert u'\\renewcommand{\\figurename}{\u56f3 }' in result assert '\\renewcommand{\\tablename}{TABLE }' in result - assert '\\floatname{literal-block}{LIST }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=LIST }' in result assert u'\\hyperref[index:fig1]{\u56f3 \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{TABLE \\ref{index:table-1}}' in result diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index be7ee3add..4f07beb99 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -64,7 +64,7 @@ def test_code_block_caption_html(app, status, warning): def test_code_block_caption_latex(app, status, warning): app.builder.build_all() latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\caption{caption \\emph{test} rb}' + caption = '\\captionof{literal-block}{caption \\emph{test} rb}' assert caption in latex @@ -205,5 +205,5 @@ def test_literalinclude_caption_html(app, status, warning): def test_literalinclude_caption_latex(app, status, warning): app.builder.build('index') latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\caption{caption \\textbf{test} py}' + caption = '\\captionof{literal-block}{caption \\textbf{test} py}' assert caption in latex From 8b47cc52b19dd2b6e6933b2d7fc02f9ae6a6e5bd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 10 Dec 2015 00:15:07 +0900 Subject: [PATCH 09/12] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index e26e817dd..2422fb330 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Bugs fixed * #2134: Fix figure caption with reference causes latex build error * #2094: Fix rubric with reference not working in Latex +* #2147: Fix litralinclude code in latex does not break in pages Release 1.3.3 (released Dec 2, 2015) From 2ee03a272941da480e933478c7b1ae3153158bca Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Thu, 17 Dec 2015 18:53:30 -0800 Subject: [PATCH 10/12] Fix #981: LaTeX: support image file names with more than 1 dots LaTeX cannot detect image file names with more than 1 dots in it correctly. The solution is to use '{}' to surround the base name. See https://tex.stackexchange.com/questions/10574/includegraphics-dots-in-filename Fix #981 --- sphinx/writers/latex.py | 3 ++- tests/root/images.txt | 3 +++ tests/root/img.foo.png | Bin 0 -> 67765 bytes tests/test_environment.py | 10 ++++++---- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 tests/root/img.foo.png diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 291bedbab..88bf1073f 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1182,7 +1182,8 @@ class LaTeXTranslator(nodes.NodeVisitor): options = '' if include_graphics_options: options = '[%s]' % ','.join(include_graphics_options) - self.body.append('\\includegraphics%s{%s}' % (options, uri)) + base, ext = path.splitext(uri) + self.body.append('\\includegraphics%s{{%s}%s}' % (options, base, ext)) self.body.extend(post) def depart_image(self, node): diff --git a/tests/root/images.txt b/tests/root/images.txt index bd64d573a..e78f8be3c 100644 --- a/tests/root/images.txt +++ b/tests/root/images.txt @@ -26,3 +26,6 @@ Sphinx image handling .. an SVG image (for HTML at least) .. image:: svgimg.* + +.. an image with more than 1 dot in its file name +.. image:: img.foo.png diff --git a/tests/root/img.foo.png b/tests/root/img.foo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8f89929f2483a249c42ec5358016b9f1073f47 GIT binary patch literal 67765 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 Date: Wed, 16 Dec 2015 15:10:52 +0000 Subject: [PATCH 11/12] Fix #2177: Remove parallel hangs --- CHANGES | 1 + sphinx/builders/__init__.py | 3 +- sphinx/util/parallel.py | 106 +++++++++++++++++------------------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/CHANGES b/CHANGES index 2422fb330..2543cf7ad 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Release 1.3.3 (released Dec 2, 2015) Bugs fixed ---------- +* #2177: Fix parallel hangs * #2012: Fix exception occurred if ``numfig_format`` is invalid * #2142: Provide non-minified JS code in ``sphinx/search/non-minified-js/*.js`` for source distribution on PyPI. diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index eebd6af64..2688f8466 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -14,9 +14,8 @@ from os import path try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None from docutils import nodes diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index 1d1e0a098..a6985c86b 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -14,11 +14,10 @@ import traceback try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None -from six.moves import queue +from math import sqrt from sphinx.errors import SphinxParallelError @@ -49,17 +48,22 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # list of threads to join when waiting for completion + # main task performed by each task, returning result + self._task_func = 0 + # (optional) function performed by each task on the result of main task + self._result_func = 0 + # task arguments + self._args = {} + # list of subprocesses (both started and waiting) + self._procs = {} + # list of receiving pipe connections of running subprocesses + self._precvs = {} + # list of receiving pipe connections of waiting subprocesses + self._precvsWaiting = {} + # number of working subprocesses + self._pworking = 0 + # task number of each subprocess self._taskid = 0 - self._threads = {} - self._nthreads = 0 - # queue of result objects to process - self.result_queue = queue.Queue() - self._nprocessed = 0 - # maps tasks to result functions - self._result_funcs = {} - # allow only "nproc" worker processes at once - self._semaphore = threading.Semaphore(self.nproc) def _process(self, pipe, func, arg): try: @@ -71,55 +75,44 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _process_thread(self, tid, func, arg): - precv, psend = multiprocessing.Pipe(False) - proc = multiprocessing.Process(target=self._process, - args=(psend, func, arg)) - proc.start() - result = precv.recv() - self.result_queue.put((tid, arg) + result) - proc.join() - self._semaphore.release() + def _result_func_wrapper(self, arg, result): + result_func = self._result_func(arg, result) + if result_func: + result_func(result) def add_task(self, task_func, arg=None, result_func=None): + self._task_func = task_func # dummy code after first call + self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 - self._semaphore.acquire() - thread = threading.Thread(target=self._process_thread, - args=(tid, task_func, arg)) - thread.setDaemon(True) - thread.start() - self._nthreads += 1 - self._threads[tid] = thread - self._result_funcs[tid] = result_func or (lambda *x: None) - # try processing results already in parallel - try: - tid, arg, exc, result = self.result_queue.get(False) - except queue.Empty: - pass + self._args[tid] = arg + precv, psend = multiprocessing.Pipe(False) + proc = multiprocessing.Process(target=self._process, + args=(psend, self._task_func, arg)) + self._procs[tid] = proc + if self._pworking < self.nproc: + self._precvs[tid] = precv + self._pworking += 1 + proc.start() else: - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 + self._precvsWaiting[tid] = precv def join(self): - while self._nprocessed < self._nthreads: - tid, arg, exc, result = self.result_queue.get() - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 - - # there shouldn't be any threads left... - for t in self._threads.values(): - t.join() + while self._pworking: + for tid, pipe in self._precvs.items(): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_func_wrapper(self._args[tid], result) + self._procs[tid].join() + if len(self._precvsWaiting) > 0: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + break + else: + self._pworking -= 1 def make_chunks(arguments, nproc, maxbatch=10): @@ -128,6 +121,9 @@ def make_chunks(arguments, nproc, maxbatch=10): chunksize = min(nargs // nproc, maxbatch) if chunksize == 0: chunksize = 1 + if chunksize == maxbatch: + # try to improve batch size vs. number of batches + chunksize = int(sqrt(nargs/nproc * maxbatch)) nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1 From 580405c714fc338f45e6694120a52bfdb84f8ca9 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 18 Dec 2015 21:02:46 +0100 Subject: [PATCH 12/12] More parallel code optimizations. --- sphinx/util/parallel.py | 67 +++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index a6985c86b..618fbdc38 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -10,14 +10,16 @@ """ import os +import time import traceback +from math import sqrt try: import multiprocessing except ImportError: multiprocessing = None -from math import sqrt +from six import iteritems from sphinx.errors import SphinxParallelError @@ -48,10 +50,8 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # main task performed by each task, returning result - self._task_func = 0 # (optional) function performed by each task on the result of main task - self._result_func = 0 + self._result_funcs = {} # task arguments self._args = {} # list of subprocesses (both started and waiting) @@ -75,55 +75,50 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _result_func_wrapper(self, arg, result): - result_func = self._result_func(arg, result) - if result_func: - result_func(result) - def add_task(self, task_func, arg=None, result_func=None): - self._task_func = task_func # dummy code after first call - self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 + self._result_funcs[tid] = result_func or (lambda arg: None) self._args[tid] = arg precv, psend = multiprocessing.Pipe(False) proc = multiprocessing.Process(target=self._process, - args=(psend, self._task_func, arg)) + args=(psend, task_func, arg)) self._procs[tid] = proc - if self._pworking < self.nproc: - self._precvs[tid] = precv - self._pworking += 1 - proc.start() - else: - self._precvsWaiting[tid] = precv + self._precvsWaiting[tid] = precv + self._join_one() def join(self): while self._pworking: - for tid, pipe in self._precvs.items(): - if pipe.poll(): - exc, result = pipe.recv() - if exc: - raise SphinxParallelError(*result) - self._result_func_wrapper(self._args[tid], result) - self._procs[tid].join() - if len(self._precvsWaiting) > 0: - newtid, newprecv = self._precvsWaiting.popitem() - self._precvs[newtid] = newprecv - self._procs[newtid].start() - break - else: - self._pworking -= 1 + self._join_one() + + def _join_one(self): + for tid, pipe in iteritems(self._precvs): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_funcs.pop(tid)(self._args.pop(tid), result) + self._procs[tid].join() + self._pworking -= 1 + break + else: + time.sleep(0.02) + while self._precvsWaiting and self._pworking < self.nproc: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + self._pworking += 1 def make_chunks(arguments, nproc, maxbatch=10): # determine how many documents to read in one go nargs = len(arguments) - chunksize = min(nargs // nproc, maxbatch) - if chunksize == 0: - chunksize = 1 - if chunksize == maxbatch: + chunksize = nargs // nproc + if chunksize >= maxbatch: # try to improve batch size vs. number of batches chunksize = int(sqrt(nargs/nproc * maxbatch)) + if chunksize == 0: + chunksize = 1 nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1