Repository: kedro-org/kedro

Issue:
Inform users about not using `--async`
## Description
As discussed in https://github.com/kedro-org/kedro/issues/2036#issuecomment-1460425776 there's a possibility that users aren't aware of the `--async` feature. Instead of only logging that the async is enabled when it is, change the logging to mention that async isn't being used by default and offer steps on how to use it. 

## Context
https://github.com/kedro-org/kedro/issues/2036

## Possible Implementation
Message could be: "Asynchronous mode is disabled for loading and saving data. Use the `--async` flag for potential performance gains. https://docs.kedro.org/en/stable/nodes_and_pipelines/run_a_pipeline.html#load-and-save-asynchronously"
(Not sure if a link in logs is good practice though.. )


Discussion:
merelcht: > @merelcht , thank you for this PR, I noticed a little bit of code repetition in 2 classes, maybe we need to consider to move this common code to AbstractRunner class, like:
> 
> ```
> if isinstance(self, (SequentialRunner, ParallelRunner)) and not self._is_async:
>             self._logger.info(...
> ```

It's a good point, but then I was thinking the `AbstractRunner` ideally shouldn't have any logic specific to the implementations, so that's why I did it on the individual classes.

Patch:
diff --git a/RELEASE.md b/RELEASE.md
index 401d6efc..f5ddf807 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -3,8 +3,7 @@
 ## Major features and improvements
 
 ## Bug fixes and other changes
-
-## Breaking changes to the API
+* Added logging about not using async mode in `SequentiallRunner` and `ParallelRunner`.
 
 ## Documentation changes
 
diff --git a/kedro/runner/parallel_runner.py b/kedro/runner/parallel_runner.py
index 309eef07..9d4081f1 100644
--- a/kedro/runner/parallel_runner.py
+++ b/kedro/runner/parallel_runner.py
@@ -256,6 +256,11 @@ class ParallelRunner(AbstractRunner):
 
         """
         # noqa: import-outside-toplevel,cyclic-import
+        if not self._is_async:
+            self._logger.info(
+                "Using synchronous mode for loading and saving data. Use the --async flag "
+                "for potential performance gains. https://docs.kedro.org/en/stable/nodes_and_pipelines/run_a_pipeline.html#load-and-save-asynchronously"
+            )
 
         nodes = pipeline.nodes
         self._validate_catalog(catalog, pipeline)
diff --git a/kedro/runner/sequential_runner.py b/kedro/runner/sequential_runner.py
index a93f8642..3270df51 100644
--- a/kedro/runner/sequential_runner.py
+++ b/kedro/runner/sequential_runner.py
@@ -60,6 +60,11 @@ class SequentialRunner(AbstractRunner):
         Raises:
             Exception: in case of any downstream node failure.
         """
+        if not self._is_async:
+            self._logger.info(
+                "Using synchronous mode for loading and saving data. Use the --async flag "
+                "for potential performance gains. https://docs.kedro.org/en/stable/nodes_and_pipelines/run_a_pipeline.html#load-and-save-asynchronously"
+            )
         nodes = pipeline.nodes
         done_nodes = set()
 


Test patch:
diff --git a/tests/runner/test_parallel_runner.py b/tests/runner/test_parallel_runner.py
index e931bdbf..fb967b2c 100644
--- a/tests/runner/test_parallel_runner.py
+++ b/tests/runner/test_parallel_runner.py
@@ -73,6 +73,11 @@ class TestValidParallelRunner:
         assert len(result["Z"]) == 3
         assert result["Z"] == ("42", "42", "42")
 
+    def test_log_not_using_async(self, fan_out_fan_in, catalog, caplog):
+        catalog.add_feed_dict({"A": 42})
+        ParallelRunner().run(fan_out_fan_in, catalog)
+        assert "Using synchronous mode for loading and saving data." in caplog.text
+
 
 class TestMaxWorkers:
     @pytest.mark.parametrize("is_async", [False, True])
diff --git a/tests/runner/test_sequential_runner.py b/tests/runner/test_sequential_runner.py
index db6b07a5..3ee297c0 100644
--- a/tests/runner/test_sequential_runner.py
+++ b/tests/runner/test_sequential_runner.py
@@ -29,6 +29,11 @@ class TestValidSequentialRunner:
         assert "Z" in result
         assert result["Z"] == (42, 42, 42)
 
+    def test_log_not_using_async(self, fan_out_fan_in, catalog, caplog):
+        catalog.add_feed_dict({"A": 42})
+        SequentialRunner().run(fan_out_fan_in, catalog)
+        assert "Using synchronous mode for loading and saving data." in caplog.text
+
 
 @pytest.mark.parametrize("is_async", [False, True])
 class TestSeqentialRunnerBranchlessPipeline:
diff --git a/tests/runner/test_thread_runner.py b/tests/runner/test_thread_runner.py
index 5d2efefe..b570f35c 100644
--- a/tests/runner/test_thread_runner.py
+++ b/tests/runner/test_thread_runner.py
@@ -34,6 +34,11 @@ class TestValidThreadRunner:
         assert "Z" in result
         assert result["Z"] == ("42", "42", "42")
 
+    def test_does_not_log_not_using_async(self, fan_out_fan_in, catalog, caplog):
+        catalog.add_feed_dict({"A": 42})
+        ThreadRunner().run(fan_out_fan_in, catalog)
+        assert "Using synchronous mode for loading and saving data." not in caplog.text
+
 
 class TestMaxWorkers:
     @pytest.mark.parametrize(