<h1 dir="auto">Checklist</h1>

<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/issues?q=is%3Aissue+label%3A%22Issue+Type%3A+Enhancement%22+-label%3A%22Category%3A+Documentation%22">issues list</a><br>
for similar or identical enhancement to an existing feature.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/pulls?q=is%3Apr+label%3A%22Issue+Type%3A+Enhancement%22+-label%3A%22Category%3A+Documentation%22">pull requests list</a><br>
for existing proposed enhancements.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/commits/main">commit log</a><br>
to find out if the if the same enhancement was already implemented in the<br>
main branch.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have included all related issues and possible duplicate issues in this issue<br>
(If there are none, check this box anyway).</li>
</ul>
<h2 dir="auto">Related Issues and Possible Duplicates</h2>

<h4 dir="auto">Related Issues</h4>
<ul dir="auto">
<li>None</li>
</ul>
<h4 dir="auto">Possible Duplicates</h4>
<ul dir="auto">
<li>None</li>
</ul>
<h1 dir="auto">Brief Summary</h1>

<p dir="auto"><code class="notranslate">celery.utils.iso8601</code> is historic module which <code class="notranslate">.parse_iso8601()</code> can be replaced by <code class="notranslate">datetime.datetime.fromisoformat()</code> as Python 3.7 or above is now supported.</p>
<p dir="auto">Suggest deprecate this module and use <code class="notranslate">datetime.datetime.fromisoformat()</code> internally.</p>
<h1 dir="auto">Design</h1>
<h2 dir="auto">Architectural Considerations</h2>

<p dir="auto">None</p>
<h2 dir="auto">Proposed Behavior</h2>

<ul dir="auto">
<li><code class="notranslate">iso8601</code> module is still usable before v6.0.0, but with addition of deprecation warning</li>
<li>remove <code class="notranslate">iso8601</code> module in v6.0.0</li>
<li>replace all usage of <code class="notranslate">parse_iso8601()</code> in the library by <code class="notranslate">datetime.datetime.fromisoformat</code>, with compatibility of Python 3.7 to 3.11</li>
</ul>
<h2 dir="auto">Proposed UI/UX</h2>

<p dir="auto">N/A</p>
<h2 dir="auto">Diagrams</h2>

<p dir="auto">N/A</p>
<h2 dir="auto">Alternatives</h2>

<p dir="auto">None</p>
<h1 dir="auto">Checklist</h1>

<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have verified that the issue exists against the <code class="notranslate">master</code> branch of Celery.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> This has already been asked to the <a href="https://github.com/celery/celery/discussions">discussions forum</a> first.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have read the relevant section in the<br>
<a href="http://docs.celeryproject.org/en/latest/contributing.html#other-bugs" rel="nofollow">contribution guide</a><br>
on reporting bugs.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/celery/celery/issues?q=is%3Aissue+label%3A%22Issue+Type%3A+Bug+Report%22+-label%3A%22Category%3A+Documentation%22">issues list</a><br>
for similar or identical bug reports.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have checked the <a href="https://github.com/celery/celery/pulls?q=is%3Apr+label%3A%22PR+Type%3A+Bugfix%22+-label%3A%22Category%3A+Documentation%22">pull requests list</a><br>
for existing proposed fixes.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have checked the <a href="https://github.com/celery/celery/commits/master">commit log</a><br>
to find out if the bug was already fixed in the master branch.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have included all related issues and possible duplicate issues<br>
in this issue (If there are none, check this box anyway).</li>
</ul>
<h2 dir="auto">Mandatory Debugging Information</h2>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have included the output of <code class="notranslate">celery -A proj report</code> in the issue.<br>
(if you are not able to do this, then at least specify the Celery<br>
version affected).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have verified that the issue exists against the <code class="notranslate">master</code> branch of Celery.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have included the contents of <code class="notranslate">pip freeze</code> in the issue.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have included all the versions of all the external dependencies required<br>
to reproduce this bug.</li>
</ul>
<h2 dir="auto">Optional Debugging Information</h2>

<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have tried reproducing the issue on more than one Python version<br>
and/or implementation.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have tried reproducing the issue on more than one message broker and/or<br>
result backend.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have tried reproducing the issue on more than one version of the message<br>
broker and/or result backend.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have tried reproducing the issue on more than one operating system.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have tried reproducing the issue on more than one workers pool.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have tried reproducing the issue with autoscaling, retries,<br>
ETA/Countdown &amp; rate limits disabled.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have tried reproducing the issue after downgrading<br>
and/or upgrading Celery and its dependencies.</li>
</ul>
<h2 dir="auto">Related Issues and Possible Duplicates</h2>

<h4 dir="auto">Related Issues</h4>
<ul dir="auto">
<li>None</li>
</ul>
<h4 dir="auto">Possible Duplicates</h4>
<ul dir="auto">
<li>None</li>
</ul>
<h2 dir="auto">Environment &amp; Settings</h2>

<p dir="auto"><strong>Celery version</strong>:</p>

<details>
<summary><b><code class="notranslate">celery report</code> Output:</b></summary>
<p dir="auto">
</p><div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="5.2.0 (dawn-chorus)"><pre class="notranslate"><code class="notranslate">5.2.0 (dawn-chorus)
</code></pre></div>
<p dir="auto"></p>
</details>
<h1 dir="auto">Steps to Reproduce</h1>
<h2 dir="auto">Required Dependencies</h2>

<ul dir="auto">
<li><strong>Minimal Python Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Celery Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Kombu Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Broker Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Result Backend Version</strong>: N/A or Unknown</li>
<li><strong>Minimal OS and/or Kernel Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Broker Client Version</strong>: N/A or Unknown</li>
<li><strong>Minimal Result Backend Client Version</strong>: N/A or Unknown</li>
</ul>
<h3 dir="auto">Python Packages</h3>

<details>
<summary><b><code class="notranslate">pip freeze</code> Output:</b></summary>
<p dir="auto">
</p><div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=""><pre class="notranslate"><code class="notranslate">
</code></pre></div>
<p dir="auto"></p>
</details>
<h3 dir="auto">Other Dependencies</h3>

<details>
<p dir="auto">
N/A
</p>
</details>
<h2 dir="auto">Minimally Reproducible Test Case</h2>

<details>
<p dir="auto">
</p><div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# This executes &quot;as expected&quot; - first the group, then the tasks all one after the other ...
post_processing = (task_doing_nothing.si() | task_doing_nothing.si())
workflow = chain(
    group(
        task_doing_nothing.si(),
        task_doing_nothing.si(),
    ),
    task_doing_nothing.si()
) | post_processing
workflow.delay().get()

# This executes the post processing chain twice ... which I dont understand ...
post_processing = (task_doing_nothing.si() | task_doing_nothing.si())
workflow = chain(
    group(
        task_doing_nothing.si(),
        task_doing_nothing.si(),
    ),
    task_doing_nothing.si()
)
workflow |= post_processing
workflow.delay().get()"><pre class="notranslate"><span class="pl-c"># This executes "as expected" - first the group, then the tasks all one after the other ...</span>
<span class="pl-s1">post_processing</span> <span class="pl-c1">=</span> (<span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>() <span class="pl-c1">|</span> <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>())
<span class="pl-s1">workflow</span> <span class="pl-c1">=</span> <span class="pl-en">chain</span>(
    <span class="pl-en">group</span>(
        <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>(),
        <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>(),
    ),
    <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>()
) <span class="pl-c1">|</span> <span class="pl-s1">post_processing</span>
<span class="pl-s1">workflow</span>.<span class="pl-en">delay</span>().<span class="pl-en">get</span>()

<span class="pl-c"># This executes the post processing chain twice ... which I dont understand ...</span>
<span class="pl-s1">post_processing</span> <span class="pl-c1">=</span> (<span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>() <span class="pl-c1">|</span> <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>())
<span class="pl-s1">workflow</span> <span class="pl-c1">=</span> <span class="pl-en">chain</span>(
    <span class="pl-en">group</span>(
        <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>(),
        <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>(),
    ),
    <span class="pl-s1">task_doing_nothing</span>.<span class="pl-en">si</span>()
)
<span class="pl-s1">workflow</span> |= <span class="pl-s1">post_processing</span>
<span class="pl-s1">workflow</span>.<span class="pl-en">delay</span>().<span class="pl-en">get</span>()</pre></div>
<p dir="auto"></p>
</details>
<h1 dir="auto">Expected Behavior</h1>

<p dir="auto">I would expect no difference in the two approaches detailed above, i.e. I would not expect to post_processing chain to be executed twice.</p>
<h1 dir="auto">Actual Behavior</h1>

<p dir="auto">Using the second approach post_processing chain is executed twice.</p>