taskflow 5.12.0__tar.gz → 6.0.0__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.
- {taskflow-5.12.0 → taskflow-6.0.0}/.pre-commit-config.yaml +5 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/.zuul.yaml +1 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/AUTHORS +1 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/ChangeLog +15 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/PKG-INFO +1 -1
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/conf.py +0 -1
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/engines.rst +0 -1
- taskflow-6.0.0/pyproject.toml +3 -0
- taskflow-6.0.0/releasenotes/notes/mask-keys-74b9bb5c420d8091.yaml +7 -0
- taskflow-6.0.0/releasenotes/notes/remove-process_executor-f59d40a5dd287cd7.yaml +4 -0
- taskflow-6.0.0/releasenotes/source/2025.1.rst +6 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/conf.py +0 -1
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/index.rst +1 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/atom.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/backends/__init__.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/backends/impl_blocking.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/backends/impl_executor.py +3 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/backends/impl_nonblocking.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/base.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/deciders.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/__init__.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/actions/base.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/actions/retry.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/actions/task.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/builder.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/compiler.py +9 -11
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/completer.py +5 -7
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/deciders.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/engine.py +4 -26
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/executor.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/runtime.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/scheduler.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/scopes.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/selector.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/traversal.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/base.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/helpers.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/dispatcher.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/endpoint.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/engine.py +1 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/executor.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/protocol.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/proxy.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/server.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/types.py +6 -7
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/worker.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/99_bottles.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/alphabet_soup.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/build_a_car.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/buildsystem.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/calculate_in_parallel.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/calculate_linear.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/create_parallel_volume.py +2 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/delayed_return.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/distance_calculator.py +12 -24
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/dump_memory_backend.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/echo_listener.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/example_utils.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/fake_billing.py +9 -11
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/graph_flow.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/hello_world.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/jobboard_produce_consume_colors.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/parallel_table_multiply.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/persistence_example.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/pseudo_scoping.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_from_backend.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_many_flows/my_flows.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_many_flows/resume_all.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_many_flows/run_flow.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_many_flows.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_vm_boot.py +12 -15
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_volume_create.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/retry_flow.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/reverting_linear.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/run_by_iter.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/run_by_iter_enumerate.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/share_engine_thread.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear_listening.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear_pass.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_map_reduce.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/switch_graph_flow.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/timing_listener.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/tox_conductor.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wbe_event_sender.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wbe_mandelbrot.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wbe_simple_linear.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wrapped_exception.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/exceptions.py +7 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/flow.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/formatters.py +22 -8
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/backends/__init__.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/backends/impl_redis.py +22 -18
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/backends/impl_zookeeper.py +7 -8
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/base.py +5 -7
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/base.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/capturing.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/claims.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/logging.py +10 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/printing.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/timing.py +10 -13
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/logging.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/patterns/graph_flow.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/patterns/linear_flow.py +4 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/patterns/unordered_flow.py +4 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/__init__.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/impl_dir.py +3 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/impl_memory.py +6 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/impl_sqlalchemy.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/impl_zookeeper.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -2
- taskflow-6.0.0/taskflow/persistence/backends/sqlalchemy/alembic/versions/00af93df9d77_add_unique_into_all_indexes.py +80 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/base.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/models.py +19 -24
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/path_based.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/retry.py +12 -18
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/states.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/storage.py +9 -11
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/task.py +15 -18
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/test.py +5 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/test_examples.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/action_engine/test_builder.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/action_engine/test_compile.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/action_engine/test_creation.py +0 -21
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/action_engine/test_scoping.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/base.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/test_redis_job.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/test_zk_job.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/patterns/test_graph_flow.py +18 -20
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/patterns/test_linear_flow.py +7 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/patterns/test_unordered_flow.py +12 -14
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/base.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/test_dir_persistence.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/test_memory_persistence.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/test_sql_persistence.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/test_zk_persistence.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_arguments_passing.py +3 -25
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_check_transition.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_conductors.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_deciders.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_engine_helpers.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_engines.py +19 -102
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_exceptions.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_failure.py +10 -12
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_flow_dependencies.py +62 -64
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_formatters.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_functor_task.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_listeners.py +9 -11
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_mapfunctor_task.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_notifier.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_progress.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_reducefunctor_task.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_retries.py +1 -25
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_states.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_storage.py +10 -12
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_suspend.py +2 -23
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_task.py +17 -19
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_types.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils.py +9 -11
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils_async_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils_binary.py +12 -14
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils_iter_utils.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/test_utils_threading_utils.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_creation.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_endpoint.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_executor.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_protocol.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_proxy.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_server.py +3 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_types.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/test_worker.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/utils.py +11 -15
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/entity.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/failure.py +3 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/graph.py +14 -18
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/latch.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/notifier.py +6 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/sets.py +2 -5
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/timing.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/tree.py +6 -10
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/async_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/banner.py +8 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/eventlet_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/iter_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/kazoo_utils.py +7 -9
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/kombu_utils.py +5 -7
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/misc.py +4 -6
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/persistence_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/redis_utils.py +2 -4
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/schema_utils.py +0 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/threading_utils.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/version.py +1 -3
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/PKG-INFO +1 -1
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/SOURCES.txt +5 -2
- taskflow-6.0.0/taskflow.egg-info/pbr.json +1 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/speed_test.py +2 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/state_graph.py +2 -2
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/subunit_trace.py +9 -9
- taskflow-5.12.0/taskflow/engines/action_engine/process_executor.py +0 -720
- taskflow-5.12.0/taskflow/tests/unit/action_engine/test_process_executor.py +0 -106
- taskflow-5.12.0/taskflow.egg-info/pbr.json +0 -1
- {taskflow-5.12.0 → taskflow-6.0.0}/.coveragerc +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/.mailmap +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/.pylintrc +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/.stestr.conf +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/CONTRIBUTING.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/LICENSE +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/README.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/bindep.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/diagrams/core.graffle.tgz +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/diagrams/jobboard.graffle.tgz +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/diagrams/tasks.graffle.tgz +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/diagrams/worker-engine.graffle.tgz +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/requirements.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/index.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/templates/layout.html +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/arguments_and_results.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/atoms.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/conductors.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/examples.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/exceptions.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/history.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/area_of_influence.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/conductor.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/conductor_cycle.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/distributed_flow_rpc.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/engine_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/flow_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/job_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/jobboard.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/mandelbrot.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/retry_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/task_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/tasks.png +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/wbe_request_states.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/img/worker-engine.svg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/index.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/inputs_and_outputs.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/jobs.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/notifications.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/patterns.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/persistence.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/resumption.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/shelf.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/states.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/types.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/utils.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/doc/source/user/workers.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/playbooks/tests/functional/Debian.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/playbooks/tests/functional/RedHat.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/playbooks/tests/functional/pre.yml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/.placeholder +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/deprecate-eventlet-df4a34a7d56acc47.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/disable-process_executor-python-312-d1074c816bc8303e.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/etcd-jobboard-backend-8a9fea2238fb0f12.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/remove-py38-15af791146f479e1.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/2023.1.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/2023.2.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/2024.1.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/2024.2.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/_static/.placeholder +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/_templates/.placeholder +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/ocata.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/pike.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/queens.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/rocky.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/stein.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/train.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/unreleased.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/ussuri.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/releasenotes/source/victoria.rst +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/requirements.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/run_tests.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/setup-etcd-env.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/setup.cfg +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/setup.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/conductors/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/contrib/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/action_engine/actions/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/engines/worker_based/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/pseudo_scoping.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_from_backend.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/resume_many_flows.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/retry_flow.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/reverting_linear.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/run_by_iter.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear_listening.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/simple_linear_pass.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/jobs/backends/impl_etcd.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/listeners/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/patterns/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/fixtures.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/action_engine/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/jobs/test_etcd_job.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/patterns/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/persistence/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/tests/unit/worker_based/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/types/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow/utils/__init__.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/dependency_links.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/entry_points.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/not-zip-safe +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/requires.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/taskflow.egg-info/top_level.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/test-requirements.txt +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/clear_zk.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/env_builder.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/pretty_tox.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/schema_generator.py +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/test-setup.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tools/update_states.sh +0 -0
- {taskflow-5.12.0 → taskflow-6.0.0}/tox.ini +0 -0
|
@@ -45,6 +45,7 @@ Jeremy Stanley <fungi@yuggoth.org>
|
|
|
45
45
|
Jessica Lucci <jessica.lucci@rackspace.com>
|
|
46
46
|
Ji-Wei <ji.wei3@zte.com.cn>
|
|
47
47
|
Joe Gordon <joe.gordon0@gmail.com>
|
|
48
|
+
Jose Castro Leon <jose.castro.leon@cern.ch>
|
|
48
49
|
Joshua Harlow <harlowja@gmail.com>
|
|
49
50
|
Joshua Harlow <harlowja@yahoo-inc.com>
|
|
50
51
|
Joshua Harlow <jxharlow@godaddy.com>
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
CHANGES
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
6.0.0
|
|
5
|
+
-----
|
|
6
|
+
|
|
7
|
+
* add pyproject.toml to support pip 23.1
|
|
8
|
+
* Add release note for mask keys
|
|
9
|
+
* Add mask keys parameters to failure logging
|
|
10
|
+
* Run pyupgrade to clean up Python 2 syntaxes
|
|
11
|
+
* redis: Omit ssl options when ssl is disabled
|
|
12
|
+
* Skip functional tests for .gitreview update
|
|
13
|
+
* Remove process executor
|
|
14
|
+
* Keep taskflow doc job on Ubuntu Jammy
|
|
15
|
+
* Update master for stable/2025.1
|
|
16
|
+
* Use oslo.utils implementation to parse sentinel address
|
|
17
|
+
* Sets indexes for all tables in taskflow as unique
|
|
18
|
+
|
|
4
19
|
5.12.0
|
|
5
20
|
------
|
|
6
21
|
|
|
@@ -449,7 +449,6 @@ Components
|
|
|
449
449
|
.. automodule:: taskflow.engines.action_engine.completer
|
|
450
450
|
.. automodule:: taskflow.engines.action_engine.deciders
|
|
451
451
|
.. automodule:: taskflow.engines.action_engine.executor
|
|
452
|
-
.. automodule:: taskflow.engines.action_engine.process_executor
|
|
453
452
|
.. automodule:: taskflow.engines.action_engine.runtime
|
|
454
453
|
.. automodule:: taskflow.engines.action_engine.scheduler
|
|
455
454
|
.. automodule:: taskflow.engines.action_engine.selector
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
features:
|
|
3
|
+
- |
|
|
4
|
+
Added ``mask_inputs_keys`` and ``mask_outputs_keys`` parameters to the
|
|
5
|
+
constructors for ``FailureFormatter`` and ``DynamicLoggingListener``
|
|
6
|
+
that can be used to mask sensitive information from the ``requires``
|
|
7
|
+
and ``provides`` fields respectively when logging a atom.
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2013 Rackspace Hosting Inc. All Rights Reserved.
|
|
4
2
|
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
|
|
5
3
|
#
|
|
@@ -159,7 +157,7 @@ def _build_arg_mapping(atom_name, reqs, rebind_args, function, do_infer,
|
|
|
159
157
|
return required, optional
|
|
160
158
|
|
|
161
159
|
|
|
162
|
-
class Atom(
|
|
160
|
+
class Atom(metaclass=abc.ABCMeta):
|
|
163
161
|
"""An unit of work that causes a flow to progress (in some manner).
|
|
164
162
|
|
|
165
163
|
An atom is a named object that operates with input data to perform
|
|
@@ -379,7 +377,7 @@ class Atom(object, metaclass=abc.ABCMeta):
|
|
|
379
377
|
"""
|
|
380
378
|
|
|
381
379
|
def __str__(self):
|
|
382
|
-
return '"
|
|
380
|
+
return '"{}=={}"'.format(self.name, misc.get_version_string(self))
|
|
383
381
|
|
|
384
382
|
def __repr__(self):
|
|
385
|
-
return '
|
|
383
|
+
return '<{} {}>'.format(reflection.get_class_name(self), self)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
2
|
# not use this file except in compliance with the License. You may obtain
|
|
5
3
|
# a copy of the License at
|
|
@@ -33,7 +31,7 @@ class BlockingConductor(impl_executor.ExecutorConductor):
|
|
|
33
31
|
persistence=None, engine=None,
|
|
34
32
|
engine_options=None, wait_timeout=None,
|
|
35
33
|
log=None, max_simultaneous_jobs=MAX_SIMULTANEOUS_JOBS):
|
|
36
|
-
super(
|
|
34
|
+
super().__init__(
|
|
37
35
|
name, jobboard,
|
|
38
36
|
persistence=persistence, engine=engine,
|
|
39
37
|
engine_options=engine_options,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
2
|
# not use this file except in compliance with the License. You may obtain
|
|
5
3
|
# a copy of the License at
|
|
@@ -104,7 +102,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
|
|
|
104
102
|
persistence=None, engine=None,
|
|
105
103
|
engine_options=None, wait_timeout=None,
|
|
106
104
|
log=None, max_simultaneous_jobs=MAX_SIMULTANEOUS_JOBS):
|
|
107
|
-
super(
|
|
105
|
+
super().__init__(
|
|
108
106
|
name, jobboard, persistence=persistence,
|
|
109
107
|
engine=engine, engine_options=engine_options)
|
|
110
108
|
self._wait_timeout = tt.convert_to_timeout(
|
|
@@ -139,8 +137,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
|
|
|
139
137
|
return not self._dead.is_set()
|
|
140
138
|
|
|
141
139
|
def _listeners_from_job(self, job, engine):
|
|
142
|
-
listeners = super(
|
|
143
|
-
job, engine)
|
|
140
|
+
listeners = super()._listeners_from_job(job, engine)
|
|
144
141
|
listeners.append(logging_listener.LoggingListener(engine,
|
|
145
142
|
log=self._log))
|
|
146
143
|
return listeners
|
|
@@ -178,7 +175,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
|
|
|
178
175
|
stage_func()
|
|
179
176
|
self._notifier.notify("%s_end" % event_name, details)
|
|
180
177
|
except excp.WrappedFailure as e:
|
|
181
|
-
if all(
|
|
178
|
+
if all(f.check(*self.NO_CONSUME_EXCEPTIONS) for f in e):
|
|
182
179
|
consume = False
|
|
183
180
|
if self._log.isEnabledFor(logging.WARNING):
|
|
184
181
|
if consume:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
2
|
# not use this file except in compliance with the License. You may obtain
|
|
5
3
|
# a copy of the License at
|
|
@@ -54,7 +52,7 @@ class NonBlockingConductor(impl_executor.ExecutorConductor):
|
|
|
54
52
|
engine_options=None, wait_timeout=None,
|
|
55
53
|
log=None, max_simultaneous_jobs=MAX_SIMULTANEOUS_JOBS,
|
|
56
54
|
executor_factory=None):
|
|
57
|
-
super(
|
|
55
|
+
super().__init__(
|
|
58
56
|
name, jobboard,
|
|
59
57
|
persistence=persistence, engine=engine,
|
|
60
58
|
engine_options=engine_options, wait_timeout=wait_timeout,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
2
|
# not use this file except in compliance with the License. You may obtain
|
|
5
3
|
# a copy of the License at
|
|
@@ -25,7 +23,7 @@ from taskflow.types import notifier
|
|
|
25
23
|
from taskflow.utils import misc
|
|
26
24
|
|
|
27
25
|
|
|
28
|
-
class Conductor(
|
|
26
|
+
class Conductor(metaclass=abc.ABCMeta):
|
|
29
27
|
"""Base for all conductor implementations.
|
|
30
28
|
|
|
31
29
|
Conductors act as entities which extract jobs from a jobboard, assign
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2015 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -19,7 +17,7 @@ import abc
|
|
|
19
17
|
from taskflow import states
|
|
20
18
|
|
|
21
19
|
|
|
22
|
-
class Action(
|
|
20
|
+
class Action(metaclass=abc.ABCMeta):
|
|
23
21
|
"""An action that handles executing, state changes, ... of atoms."""
|
|
24
22
|
|
|
25
23
|
NO_RESULT = object()
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2012-2013 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -24,7 +22,7 @@ class RetryAction(base.Action):
|
|
|
24
22
|
"""An action that handles executing, state changes, ... of retry atoms."""
|
|
25
23
|
|
|
26
24
|
def __init__(self, storage, notifier, retry_executor):
|
|
27
|
-
super(
|
|
25
|
+
super().__init__(storage, notifier)
|
|
28
26
|
self._retry_executor = retry_executor
|
|
29
27
|
|
|
30
28
|
def _get_retry_args(self, retry, revert=False, addons=None):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2012-2013 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -29,7 +27,7 @@ class TaskAction(base.Action):
|
|
|
29
27
|
"""An action that handles scheduling, state changes, ... of task atoms."""
|
|
30
28
|
|
|
31
29
|
def __init__(self, storage, notifier, task_executor):
|
|
32
|
-
super(
|
|
30
|
+
super().__init__(storage, notifier)
|
|
33
31
|
self._task_executor = task_executor
|
|
34
32
|
|
|
35
33
|
def _is_identity_transition(self, old_state, state, task, progress=None):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -58,7 +56,7 @@ TIMED_STATES = (st.ANALYZING, st.RESUMING, st.SCHEDULING, st.WAITING)
|
|
|
58
56
|
LOG = logging.getLogger(__name__)
|
|
59
57
|
|
|
60
58
|
|
|
61
|
-
class MachineMemory
|
|
59
|
+
class MachineMemory:
|
|
62
60
|
"""State machine memory."""
|
|
63
61
|
|
|
64
62
|
def __init__(self):
|
|
@@ -73,7 +71,7 @@ class MachineMemory(object):
|
|
|
73
71
|
fut.cancel()
|
|
74
72
|
|
|
75
73
|
|
|
76
|
-
class MachineBuilder
|
|
74
|
+
class MachineBuilder:
|
|
77
75
|
"""State machine *builder* that powers the engine components.
|
|
78
76
|
|
|
79
77
|
NOTE(harlowja): the machine (states and events that will trigger
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -46,12 +44,12 @@ ATOMS = (TASK, RETRY)
|
|
|
46
44
|
FLOWS = (FLOW, FLOW_END)
|
|
47
45
|
|
|
48
46
|
|
|
49
|
-
class Terminator
|
|
47
|
+
class Terminator:
|
|
50
48
|
"""Flow terminator class."""
|
|
51
49
|
|
|
52
50
|
def __init__(self, flow):
|
|
53
51
|
self._flow = flow
|
|
54
|
-
self._name = "
|
|
52
|
+
self._name = "{}[$]".format(self._flow.name)
|
|
55
53
|
|
|
56
54
|
@property
|
|
57
55
|
def flow(self):
|
|
@@ -68,7 +66,7 @@ class Terminator(object):
|
|
|
68
66
|
return '"%s[$]"' % flow_name
|
|
69
67
|
|
|
70
68
|
|
|
71
|
-
class Compilation
|
|
69
|
+
class Compilation:
|
|
72
70
|
"""The result of a compilers ``compile()`` is this *immutable* object."""
|
|
73
71
|
|
|
74
72
|
#: Task nodes will have a ``kind`` metadata key with this value.
|
|
@@ -135,7 +133,7 @@ def _add_update_edges(graph, nodes_from, nodes_to, attr_dict=None):
|
|
|
135
133
|
graph.add_edge(u, v, attr_dict=attr_dict.copy())
|
|
136
134
|
|
|
137
135
|
|
|
138
|
-
class TaskCompiler
|
|
136
|
+
class TaskCompiler:
|
|
139
137
|
"""Non-recursive compiler of tasks."""
|
|
140
138
|
|
|
141
139
|
def compile(self, task, parent=None):
|
|
@@ -147,7 +145,7 @@ class TaskCompiler(object):
|
|
|
147
145
|
return graph, node
|
|
148
146
|
|
|
149
147
|
|
|
150
|
-
class FlowCompiler
|
|
148
|
+
class FlowCompiler:
|
|
151
149
|
"""Recursive compiler of flows."""
|
|
152
150
|
|
|
153
151
|
def __init__(self, deep_compiler_func):
|
|
@@ -162,9 +160,9 @@ class FlowCompiler(object):
|
|
|
162
160
|
parent.add(tree_node)
|
|
163
161
|
if flow.retry is not None:
|
|
164
162
|
tree_node.add(tr.Node(flow.retry, kind=RETRY))
|
|
165
|
-
decomposed =
|
|
166
|
-
|
|
167
|
-
for child in flow
|
|
163
|
+
decomposed = {
|
|
164
|
+
child: self._deep_compiler_func(child, parent=tree_node)[0]
|
|
165
|
+
for child in flow}
|
|
168
166
|
decomposed_graphs = list(decomposed.values())
|
|
169
167
|
graph = gr.merge_graphs(graph, *decomposed_graphs,
|
|
170
168
|
overlap_detector=_overlap_occurrence_detector)
|
|
@@ -223,7 +221,7 @@ class FlowCompiler(object):
|
|
|
223
221
|
return graph, tree_node
|
|
224
222
|
|
|
225
223
|
|
|
226
|
-
class PatternCompiler
|
|
224
|
+
class PatternCompiler:
|
|
227
225
|
"""Compiles a flow pattern (or task) into a compilation unit.
|
|
228
226
|
|
|
229
227
|
Let's dive into the basic idea for how this works:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -29,7 +27,7 @@ from taskflow import states as st
|
|
|
29
27
|
LOG = logging.getLogger(__name__)
|
|
30
28
|
|
|
31
29
|
|
|
32
|
-
class Strategy(
|
|
30
|
+
class Strategy(metaclass=abc.ABCMeta):
|
|
33
31
|
"""Failure resolution strategy base class."""
|
|
34
32
|
|
|
35
33
|
strategy = None
|
|
@@ -56,7 +54,7 @@ class RevertAndRetry(Strategy):
|
|
|
56
54
|
strategy = retry_atom.RETRY
|
|
57
55
|
|
|
58
56
|
def __init__(self, runtime, retry):
|
|
59
|
-
super(
|
|
57
|
+
super().__init__(runtime)
|
|
60
58
|
self._retry = retry
|
|
61
59
|
|
|
62
60
|
def apply(self):
|
|
@@ -73,7 +71,7 @@ class RevertAll(Strategy):
|
|
|
73
71
|
strategy = retry_atom.REVERT_ALL
|
|
74
72
|
|
|
75
73
|
def __init__(self, runtime):
|
|
76
|
-
super(
|
|
74
|
+
super().__init__(runtime)
|
|
77
75
|
|
|
78
76
|
def apply(self):
|
|
79
77
|
return self._runtime.reset_atoms(
|
|
@@ -87,7 +85,7 @@ class Revert(Strategy):
|
|
|
87
85
|
strategy = retry_atom.REVERT
|
|
88
86
|
|
|
89
87
|
def __init__(self, runtime, atom):
|
|
90
|
-
super(
|
|
88
|
+
super().__init__(runtime)
|
|
91
89
|
self._atom = atom
|
|
92
90
|
|
|
93
91
|
def apply(self):
|
|
@@ -98,7 +96,7 @@ class Revert(Strategy):
|
|
|
98
96
|
return tweaked
|
|
99
97
|
|
|
100
98
|
|
|
101
|
-
class Completer
|
|
99
|
+
class Completer:
|
|
102
100
|
"""Completes atoms using actions to complete them."""
|
|
103
101
|
|
|
104
102
|
def __init__(self, runtime):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2015 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -26,7 +24,7 @@ from taskflow import states
|
|
|
26
24
|
LOG = logging.getLogger(__name__)
|
|
27
25
|
|
|
28
26
|
|
|
29
|
-
class Decider(
|
|
27
|
+
class Decider(metaclass=abc.ABCMeta):
|
|
30
28
|
"""Base class for deciders.
|
|
31
29
|
|
|
32
30
|
Provides interface to be implemented by sub-classes.
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -40,11 +38,6 @@ from taskflow import storage
|
|
|
40
38
|
from taskflow.types import failure
|
|
41
39
|
from taskflow.utils import misc
|
|
42
40
|
|
|
43
|
-
try:
|
|
44
|
-
from taskflow.engines.action_engine import process_executor
|
|
45
|
-
except ImportError:
|
|
46
|
-
process_executor = None
|
|
47
|
-
|
|
48
41
|
LOG = logging.getLogger(__name__)
|
|
49
42
|
|
|
50
43
|
|
|
@@ -170,7 +163,7 @@ class ActionEngine(base.Engine):
|
|
|
170
163
|
"""
|
|
171
164
|
|
|
172
165
|
def __init__(self, flow, flow_detail, backend, options):
|
|
173
|
-
super(
|
|
166
|
+
super().__init__(flow, flow_detail, backend, options)
|
|
174
167
|
self._runtime = None
|
|
175
168
|
self._compiled = False
|
|
176
169
|
self._compilation = None
|
|
@@ -479,8 +472,7 @@ class SerialActionEngine(ActionEngine):
|
|
|
479
472
|
"""Engine that runs tasks in serial manner."""
|
|
480
473
|
|
|
481
474
|
def __init__(self, flow, flow_detail, backend, options):
|
|
482
|
-
super(
|
|
483
|
-
backend, options)
|
|
475
|
+
super().__init__(flow, flow_detail, backend, options)
|
|
484
476
|
self._task_executor = executor.SerialTaskExecutor()
|
|
485
477
|
|
|
486
478
|
|
|
@@ -548,7 +540,6 @@ String (case insensitive) Executor used
|
|
|
548
540
|
polling while a higher number will involve less polling but a slower time
|
|
549
541
|
for an engine to notice a task has completed.
|
|
550
542
|
|
|
551
|
-
.. |pe| replace:: process_executor
|
|
552
543
|
.. |cfp| replace:: concurrent.futures.process
|
|
553
544
|
.. |cft| replace:: concurrent.futures.thread
|
|
554
545
|
.. |cf| replace:: concurrent.futures
|
|
@@ -563,16 +554,9 @@ String (case insensitive) Executor used
|
|
|
563
554
|
_executor_cls_matchers = [
|
|
564
555
|
_ExecutorTypeMatch((futures.ThreadPoolExecutor,),
|
|
565
556
|
executor.ParallelThreadTaskExecutor),
|
|
566
|
-
]
|
|
567
|
-
if process_executor is not None:
|
|
568
|
-
_executor_cls_matchers.append(
|
|
569
|
-
_ExecutorTypeMatch((futures.ProcessPoolExecutor,),
|
|
570
|
-
process_executor.ParallelProcessTaskExecutor)
|
|
571
|
-
)
|
|
572
|
-
_executor_cls_matchers.append(
|
|
573
557
|
_ExecutorTypeMatch((futures.Executor,),
|
|
574
558
|
executor.ParallelThreadTaskExecutor),
|
|
575
|
-
|
|
559
|
+
]
|
|
576
560
|
|
|
577
561
|
# One of these should match when a string/text is provided for the
|
|
578
562
|
# 'executor' option (a mixed case equivalent is allowed since the match
|
|
@@ -584,18 +568,12 @@ String (case insensitive) Executor used
|
|
|
584
568
|
'greenthreaded']),
|
|
585
569
|
executor.ParallelGreenThreadTaskExecutor),
|
|
586
570
|
]
|
|
587
|
-
if process_executor is not None:
|
|
588
|
-
_executor_str_matchers.append(
|
|
589
|
-
_ExecutorTextMatch(frozenset(['processes', 'process']),
|
|
590
|
-
process_executor.ParallelProcessTaskExecutor)
|
|
591
|
-
)
|
|
592
571
|
|
|
593
572
|
# Used when no executor is provided (either a string or object)...
|
|
594
573
|
_default_executor_cls = executor.ParallelThreadTaskExecutor
|
|
595
574
|
|
|
596
575
|
def __init__(self, flow, flow_detail, backend, options):
|
|
597
|
-
super(
|
|
598
|
-
backend, options)
|
|
576
|
+
super().__init__(flow, flow_detail, backend, options)
|
|
599
577
|
# This ensures that any provided executor will be validated before
|
|
600
578
|
# we get to far in the compilation/execution pipeline...
|
|
601
579
|
self._task_executor = self._fetch_task_executor(self._options)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -78,7 +76,7 @@ def _revert_task(task, arguments, result, failures, progress_callback=None):
|
|
|
78
76
|
return (REVERTED, result)
|
|
79
77
|
|
|
80
78
|
|
|
81
|
-
class SerialRetryExecutor
|
|
79
|
+
class SerialRetryExecutor:
|
|
82
80
|
"""Executes and reverts retries."""
|
|
83
81
|
|
|
84
82
|
def __init__(self):
|
|
@@ -105,7 +103,7 @@ class SerialRetryExecutor(object):
|
|
|
105
103
|
return fut
|
|
106
104
|
|
|
107
105
|
|
|
108
|
-
class TaskExecutor(
|
|
106
|
+
class TaskExecutor(metaclass=abc.ABCMeta):
|
|
109
107
|
"""Executes and reverts tasks.
|
|
110
108
|
|
|
111
109
|
This class takes task and its arguments and executes or reverts it.
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -43,7 +41,7 @@ _EdgeDecider = collections.namedtuple('_EdgeDecider',
|
|
|
43
41
|
LOG = logging.getLogger(__name__)
|
|
44
42
|
|
|
45
43
|
|
|
46
|
-
class Runtime
|
|
44
|
+
class Runtime:
|
|
47
45
|
"""A aggregate of runtime objects, properties, ... used during execution.
|
|
48
46
|
|
|
49
47
|
This object contains various utility methods and properties that represent
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -21,7 +19,7 @@ from taskflow import states as st
|
|
|
21
19
|
from taskflow.types import failure
|
|
22
20
|
|
|
23
21
|
|
|
24
|
-
class RetryScheduler
|
|
22
|
+
class RetryScheduler:
|
|
25
23
|
"""Schedules retry atoms."""
|
|
26
24
|
|
|
27
25
|
def __init__(self, runtime):
|
|
@@ -52,7 +50,7 @@ class RetryScheduler(object):
|
|
|
52
50
|
" intention: %s" % intention)
|
|
53
51
|
|
|
54
52
|
|
|
55
|
-
class TaskScheduler
|
|
53
|
+
class TaskScheduler:
|
|
56
54
|
"""Schedules task atoms."""
|
|
57
55
|
|
|
58
56
|
def __init__(self, runtime):
|
|
@@ -75,7 +73,7 @@ class TaskScheduler(object):
|
|
|
75
73
|
" intention: %s" % intention)
|
|
76
74
|
|
|
77
75
|
|
|
78
|
-
class Scheduler
|
|
76
|
+
class Scheduler:
|
|
79
77
|
"""Safely schedules atoms using a runtime ``fetch_scheduler`` routine."""
|
|
80
78
|
|
|
81
79
|
def __init__(self, runtime):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -21,7 +19,7 @@ from taskflow import logging
|
|
|
21
19
|
LOG = logging.getLogger(__name__)
|
|
22
20
|
|
|
23
21
|
|
|
24
|
-
class ScopeWalker
|
|
22
|
+
class ScopeWalker:
|
|
25
23
|
"""Walks through the scopes of a atom using a engines compilation.
|
|
26
24
|
|
|
27
25
|
NOTE(harlowja): for internal usage only.
|
|
@@ -79,9 +77,9 @@ class ScopeWalker(object):
|
|
|
79
77
|
"""
|
|
80
78
|
graph = self._execution_graph
|
|
81
79
|
if self._predecessors is None:
|
|
82
|
-
predecessors =
|
|
80
|
+
predecessors = {
|
|
83
81
|
node for node in graph.bfs_predecessors_iter(self._atom)
|
|
84
|
-
if graph.nodes[node]['kind'] in co.ATOMS
|
|
82
|
+
if graph.nodes[node]['kind'] in co.ATOMS}
|
|
85
83
|
self._predecessors = predecessors.copy()
|
|
86
84
|
else:
|
|
87
85
|
predecessors = self._predecessors.copy()
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
1
|
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
@@ -27,7 +25,7 @@ from taskflow.utils import iter_utils
|
|
|
27
25
|
LOG = logging.getLogger(__name__)
|
|
28
26
|
|
|
29
27
|
|
|
30
|
-
class Selector
|
|
28
|
+
class Selector:
|
|
31
29
|
"""Selector that uses a compilation and aids in execution processes.
|
|
32
30
|
|
|
33
31
|
Its primary purpose is to get the next atoms for execution or reversion
|