ocrd 3.0.0b6__tar.gz → 3.0.0b7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {ocrd-3.0.0b6/src/ocrd.egg-info → ocrd-3.0.0b7}/PKG-INFO +1 -1
  2. ocrd-3.0.0b7/VERSION +1 -0
  3. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/base.py +22 -7
  4. ocrd-3.0.0b7/src/ocrd/processor/concurrent.py +909 -0
  5. {ocrd-3.0.0b6 → ocrd-3.0.0b7/src/ocrd.egg-info}/PKG-INFO +1 -1
  6. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/SOURCES.txt +1 -0
  7. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/logging.py +27 -56
  8. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/ocrd_logging.conf +14 -16
  9. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_decorators.py +7 -10
  10. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_logging.py +6 -0
  11. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_logging_conf.py +21 -28
  12. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_mets_server.py +19 -9
  13. ocrd-3.0.0b6/VERSION +0 -1
  14. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/LICENSE +0 -0
  15. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/MANIFEST.in +0 -0
  16. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README.md +0 -0
  17. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_bashlib.md +0 -0
  18. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd.md +0 -0
  19. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_modelfactory.md +0 -0
  20. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_models.md +0 -0
  21. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_network.md +0 -0
  22. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_utils.md +0 -0
  23. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_validators.md +0 -0
  24. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/pyproject.toml +0 -0
  25. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/requirements.txt +0 -0
  26. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/setup.cfg +0 -0
  27. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/__init__.py +0 -0
  28. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/__init__.py +0 -0
  29. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/bashlib.py +0 -0
  30. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/log.py +0 -0
  31. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/network.py +0 -0
  32. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/ocrd_tool.py +0 -0
  33. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/process.py +0 -0
  34. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/resmgr.py +0 -0
  35. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/validate.py +0 -0
  36. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/workspace.py +0 -0
  37. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/zip.py +0 -0
  38. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/constants.py +0 -0
  39. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/__init__.py +0 -0
  40. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/loglevel_option.py +0 -0
  41. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/mets_find_options.py +0 -0
  42. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/ocrd_cli_options.py +0 -0
  43. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/parameter_option.py +0 -0
  44. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/lib.bash +0 -0
  45. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/mets_server.py +0 -0
  46. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/ocrd-all-tool.json +0 -0
  47. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/__init__.py +0 -0
  48. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/__init__.py +0 -0
  49. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy/__init__.py +0 -0
  50. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy/ocrd-tool.json +0 -0
  51. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy_processor.py +0 -0
  52. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/helpers.py +0 -0
  53. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/ocrd_page_result.py +0 -0
  54. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resolver.py +0 -0
  55. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resource_list.yml +0 -0
  56. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resource_manager.py +0 -0
  57. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/task_sequence.py +0 -0
  58. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace.py +0 -0
  59. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace_backup.py +0 -0
  60. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace_bagger.py +0 -0
  61. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/dependency_links.txt +0 -0
  62. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/entry_points.txt +0 -0
  63. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/requires.txt +0 -0
  64. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/top_level.txt +0 -0
  65. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_modelfactory/__init__.py +0 -0
  66. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/__init__.py +0 -0
  67. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/constants.py +0 -0
  68. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/mets-empty.xml +0 -0
  69. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_agent.py +0 -0
  70. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_exif.py +0 -0
  71. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_file.py +0 -0
  72. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_mets.py +0 -0
  73. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_page.py +0 -0
  74. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_page_generateds.py +0 -0
  75. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_xml_base.py +0 -0
  76. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/report.py +0 -0
  77. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/utils.py +0 -0
  78. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/__init__.py +0 -0
  79. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/__init__.py +0 -0
  80. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/client.py +0 -0
  81. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processing_server.py +0 -0
  82. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processing_worker.py +0 -0
  83. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processor_server.py +0 -0
  84. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/client.py +0 -0
  85. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/client_utils.py +0 -0
  86. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/constants.py +0 -0
  87. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/database.py +0 -0
  88. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/logging_utils.py +0 -0
  89. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/__init__.py +0 -0
  90. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/job.py +0 -0
  91. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/messages.py +0 -0
  92. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/ocrd_tool.py +0 -0
  93. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/workflow.py +0 -0
  94. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/workspace.py +0 -0
  95. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/param_validators.py +0 -0
  96. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/process_helpers.py +0 -0
  97. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processing_server.py +0 -0
  98. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processing_worker.py +0 -0
  99. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processor_server.py +0 -0
  100. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/__init__.py +0 -0
  101. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/connector.py +0 -0
  102. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/constants.py +0 -0
  103. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/consumer.py +0 -0
  104. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/helpers.py +0 -0
  105. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/ocrd_messages.py +0 -0
  106. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/publisher.py +0 -0
  107. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/__init__.py +0 -0
  108. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/config_parser.py +0 -0
  109. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/connection_clients.py +0 -0
  110. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/deployer.py +0 -0
  111. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/hosts.py +0 -0
  112. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/network_agents.py +0 -0
  113. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/network_services.py +0 -0
  114. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/server_cache.py +0 -0
  115. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/server_utils.py +0 -0
  116. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/tcp_to_uds_mets_proxy.py +0 -0
  117. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/utils.py +0 -0
  118. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/__init__.py +0 -0
  119. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/config.py +0 -0
  120. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/constants.py +0 -0
  121. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/deprecate.py +0 -0
  122. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/image.py +0 -0
  123. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/introspect.py +0 -0
  124. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/os.py +0 -0
  125. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/str.py +0 -0
  126. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/__init__.py +0 -0
  127. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/bagit-profile.yml +0 -0
  128. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/constants.py +0 -0
  129. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/json_validator.py +0 -0
  130. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/message_processing.schema.yml +0 -0
  131. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/message_result.schema.yml +0 -0
  132. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/mets.xsd +0 -0
  133. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_network_message_validator.py +0 -0
  134. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_tool.schema.yml +0 -0
  135. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_tool_validator.py +0 -0
  136. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_zip_validator.py +0 -0
  137. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/page.xsd +0 -0
  138. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/page_validator.py +0 -0
  139. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/parameter_validator.py +0 -0
  140. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/processing_server_config.schema.yml +0 -0
  141. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/processing_server_config_validator.py +0 -0
  142. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/resource_list_validator.py +0 -0
  143. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/workspace_validator.py +0 -0
  144. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xlink.xsd +0 -0
  145. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_mets_validator.py +0 -0
  146. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_page_validator.py +0 -0
  147. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_validator.py +0 -0
  148. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_model_factory.py +0 -0
  149. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resolver.py +0 -0
  150. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resolver_oai.py +0 -0
  151. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resource_manager.py +0 -0
  152. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_task_sequence.py +0 -0
  153. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_utils.py +0 -0
  154. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_version.py +0 -0
  155. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_workspace.py +0 -0
  156. {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_workspace_remove.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ocrd
3
- Version: 3.0.0b6
3
+ Version: 3.0.0b7
4
4
  Summary: OCR-D framework
5
5
  Author-email: Konstantin Baierer <unixprog@gmail.com>
6
6
  License: Apache License 2.0
ocrd-3.0.0b7/VERSION ADDED
@@ -0,0 +1 @@
1
+ 3.0.0b7
@@ -18,10 +18,11 @@ from os import getcwd
18
18
  from pathlib import Path
19
19
  from typing import Any, Dict, List, Optional, Tuple, Union, get_args
20
20
  import sys
21
+ import logging
22
+ import logging.handlers
21
23
  import inspect
22
24
  import tarfile
23
25
  import io
24
- import weakref
25
26
  from collections import defaultdict
26
27
  from frozendict import frozendict
27
28
  # concurrent.futures is buggy in py38,
@@ -158,12 +159,12 @@ class Processor():
158
159
 
159
160
  max_workers : int = -1
160
161
  """
161
- maximum number of processor threads for page-parallel processing (ignored if negative),
162
+ maximum number of processor forks for page-parallel processing (ignored if negative),
162
163
  to be applied on top of :py:data:`~ocrd_utils.config.OCRD_MAX_PARALLEL_PAGES` (i.e.
163
164
  whatever is smaller).
164
165
 
165
166
  (Override this if you know how many pages fit into processing units - GPU shaders / CPU cores
166
- - at once, or if your class is not thread-safe.)
167
+ - at once, or if your class already creates threads prior to forking, e.g. during ``setup``.)
167
168
  """
168
169
 
169
170
  max_page_seconds : int = -1
@@ -366,12 +367,14 @@ class Processor():
366
367
  self._base_logger = getLogger('ocrd.processor.base')
367
368
  if parameter is not None:
368
369
  self.parameter = parameter
369
- # ensure that shutdown gets called at destruction
370
- self._finalizer = weakref.finalize(self, self.shutdown)
371
370
  # workaround for deprecated#72 (@deprecated decorator does not work for subclasses):
372
371
  setattr(self, 'process',
373
372
  deprecated(version='3.0', reason='process() should be replaced with process_page_pcgts() or process_page_file() or process_workspace()')(getattr(self, 'process')))
374
373
 
374
+ def __del__(self):
375
+ self._base_logger.debug("shutting down")
376
+ self.shutdown()
377
+
375
378
  def show_help(self, subcommand=None):
376
379
  """
377
380
  Print a usage description including the standard CLI and all of this processor's ocrd-tool
@@ -514,22 +517,31 @@ class Processor():
514
517
 
515
518
  if max_workers > 1:
516
519
  executor_cls = ProcessPoolExecutor
520
+ log_queue = mp.Queue()
521
+ # forward messages from log queue (in subprocesses) to all root handlers
522
+ log_listener = logging.handlers.QueueListener(log_queue, *logging.root.handlers, respect_handler_level=True)
517
523
  else:
518
524
  executor_cls = DummyExecutor
525
+ log_queue = None
526
+ log_listener = None
519
527
  executor = executor_cls(
520
528
  max_workers=max_workers or 1,
521
529
  # only forking method avoids pickling
522
530
  context=mp.get_context('fork'),
523
531
  # share processor instance as global to avoid pickling
524
532
  initializer=_page_worker_set_ctxt,
525
- initargs=(self,),
533
+ initargs=(self, log_queue),
526
534
  )
535
+ if max_workers > 1:
536
+ log_listener.start()
527
537
  try:
528
538
  self._base_logger.debug("started executor %s with %d workers", str(executor), max_workers or 1)
529
539
  tasks = self.process_workspace_submit_tasks(executor, max_seconds)
530
540
  stats = self.process_workspace_handle_tasks(tasks)
531
541
  finally:
532
542
  executor.shutdown(kill_workers=True, wait=False)
543
+ if max_workers > 1:
544
+ log_listener.stop()
533
545
 
534
546
  except NotImplementedError:
535
547
  # fall back to deprecated method
@@ -1109,13 +1121,16 @@ in Processor.process_workspace. Forking allows inheriting global
1109
1121
  objects, and with the METS Server we do not mutate the local
1110
1122
  processor instance anyway.
1111
1123
  """
1112
- def _page_worker_set_ctxt(processor):
1124
+ def _page_worker_set_ctxt(processor, log_queue):
1113
1125
  """
1114
1126
  Overwrites `ocrd.processor.base._page_worker_processor` instance
1115
1127
  for sharing with subprocesses in ProcessPoolExecutor initializer.
1116
1128
  """
1117
1129
  global _page_worker_processor
1118
1130
  _page_worker_processor = processor
1131
+ if log_queue:
1132
+ # replace all log handlers with just one queue handler
1133
+ logging.root.handlers = [logging.handlers.QueueHandler(log_queue)]
1119
1134
 
1120
1135
  def _page_worker(timeout, *input_files):
1121
1136
  """