### Summary

When ansible(-playbook) iterates over a very large list (3700 items in my case), it hangs after processing the last item, cpu usage goes to 100% and memory usage rises until the process gets killed by linux OOM-killer.

This happens when I enable the `extended` option of `loop_control`, but does not happen on small lists (10 items).

### Issue Type

Bug Report

### Component Name

loop_control

### Ansible Version

```console
$ ansible --version
ansible 2.9.21
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/xxxx/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, May  3 2017, 07:55:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-14)]
```


### Configuration

```console
$ ansible-config dump --only-changed
ANSIBLE_PIPELINING(/home/xxxx/playbooks/ansible.cfg) = True
DEFAULT_BECOME_EXE(/home/xxxx/playbooks/ansible.cfg) = sudo su -
DEFAULT_BECOME_METHOD(/home/xxxx/playbooks/ansible.cfg) = su
DEFAULT_HOST_LIST(/home/xxxx/playbooks/ansible.cfg) = [u'/home/xxxx/playbooks/hosts']
DEFAULT_REMOTE_USER(/home/xxxx/playbooks/ansible.cfg) = ansible
DISPLAY_SKIPPED_HOSTS(/home/xxxx/playbooks/ansible.cfg) = False
```


### OS / Environment

- **OS**: `Red Hat Enterprise Linux Server release 7.4 (Maipo)`
- **CPU**: `Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz`
- **Mem**: `16GB`

### Steps to Reproduce

This is the problematic playbook task:
```yaml
- name: Install network devices configuration files
  template:
    src: telegraf-device.toml.j2
    dest: "{{telegraf_include_dir}}/{{item.hostname}}.conf"
    owner: telegraf
    group: telegraf
  loop: "{{large_list_of_devices}}"
  loop_control:
    index_var: index
    extended: yes
    label: "{{item.hostname}} - {{item.address}}"
  when: true # redacted the condition, not sure if it is relevant
  register: managed_device_configs
  notify: reload telegraf
```


### Expected Results

I expect ansible to be able to iterate over this large list with `extended` enabled and continue to the next task after the last item.

### Actual Results

```console
...
TASK [xxxxx] *********************************************************************************************
ok: [xxxx] => (item=XXXXX - xxx.xxx.xxx.xxx)
ok: [xxxx] => (item=XXXXX - xxx.xxx.xxx.xxx)
....
changed: [xxxx] => (item=XXXXX - xxx.xxx.xxx.xxx)
ok: [xxxx] => (item=XXXXX - xxx.xxx.xxx.xxx)
ok: [xxxx] => (item=XXXXX - xxx.xxx.xxx.xxx)
NOTIFIED HANDLER xxxx for xxxx
Killed
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
elif self._task.action in C._ACTION_INCLUDE_ROLE:
            include_args = self._task.args.copy()
            return dict(include_args=include_args)
        
        try:
            self._task.post_validate(templar=templar)
        except AnsibleError:
            raise
        except Exception:
            return dict(changed=False, failed=True, _ansible_no_log=no_log, exception=to_text(traceback.format_exc()))
        if '_variable_params' in self._task.args:
            variable_params = self._task.args.pop('_variable_params')
            if isinstance(variable_params, dict):
                if C.INJECT_FACTS_AS_VARS:
                    display.warning("Using a variable for a task's 'args' is unsafe in some situations "
                                    "(see https://docs.ansible.com/ansible/devel/reference_appendices/faq.html#argsplat-unsafe)")
                variable_params.update(self._task.args)
                self._task.args = variable_params
        
        no_log = self._task.no_log
        
        
        tempvars = {}
        
        if self._task.delegate_to:
            
            cvars = variables.get('ansible_delegated_vars', {}).get(self._task.delegate_to, {})
        else:
            
            cvars = variables