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.
- {ocrd-3.0.0b6/src/ocrd.egg-info → ocrd-3.0.0b7}/PKG-INFO +1 -1
- ocrd-3.0.0b7/VERSION +1 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/base.py +22 -7
- ocrd-3.0.0b7/src/ocrd/processor/concurrent.py +909 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7/src/ocrd.egg-info}/PKG-INFO +1 -1
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/SOURCES.txt +1 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/logging.py +27 -56
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/ocrd_logging.conf +14 -16
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_decorators.py +7 -10
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_logging.py +6 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_logging_conf.py +21 -28
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_mets_server.py +19 -9
- ocrd-3.0.0b6/VERSION +0 -1
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/LICENSE +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/MANIFEST.in +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_bashlib.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_modelfactory.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_models.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_network.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_utils.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/README_ocrd_validators.md +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/pyproject.toml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/requirements.txt +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/setup.cfg +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/bashlib.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/log.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/network.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/ocrd_tool.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/process.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/resmgr.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/validate.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/workspace.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/cli/zip.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/loglevel_option.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/mets_find_options.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/ocrd_cli_options.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/decorators/parameter_option.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/lib.bash +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/mets_server.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/ocrd-all-tool.json +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy/ocrd-tool.json +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/builtin/dummy_processor.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/helpers.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/processor/ocrd_page_result.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resolver.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resource_list.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/resource_manager.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/task_sequence.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace_backup.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd/workspace_bagger.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/dependency_links.txt +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/entry_points.txt +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/requires.txt +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd.egg-info/top_level.txt +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_modelfactory/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/mets-empty.xml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_agent.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_exif.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_file.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_mets.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_page.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_page_generateds.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/ocrd_xml_base.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/report.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_models/utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/client.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processing_server.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processing_worker.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/cli/processor_server.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/client.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/client_utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/database.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/logging_utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/job.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/messages.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/ocrd_tool.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/workflow.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/models/workspace.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/param_validators.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/process_helpers.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processing_server.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processing_worker.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/processor_server.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/connector.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/consumer.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/helpers.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/ocrd_messages.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/rabbitmq_utils/publisher.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/config_parser.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/connection_clients.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/deployer.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/hosts.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/network_agents.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/runtime_data/network_services.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/server_cache.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/server_utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/tcp_to_uds_mets_proxy.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_network/utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/config.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/deprecate.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/image.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/introspect.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/os.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_utils/str.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/__init__.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/bagit-profile.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/constants.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/json_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/message_processing.schema.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/message_result.schema.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/mets.xsd +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_network_message_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_tool.schema.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_tool_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/ocrd_zip_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/page.xsd +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/page_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/parameter_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/processing_server_config.schema.yml +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/processing_server_config_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/resource_list_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/workspace_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xlink.xsd +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_mets_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_page_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/src/ocrd_validators/xsd_validator.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_model_factory.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resolver.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resolver_oai.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_resource_manager.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_task_sequence.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_utils.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_version.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_workspace.py +0 -0
- {ocrd-3.0.0b6 → ocrd-3.0.0b7}/tests/test_workspace_remove.py +0 -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
|
|
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
|
|
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
|
"""
|