|
41 | 41 | * Davide Vanzo (Vanderbilt University) |
42 | 42 | * Caspar van Leeuwen (SURF) |
43 | 43 | """ |
44 | | - |
45 | 44 | import copy |
46 | 45 | import glob |
47 | 46 | import inspect |
|
52 | 51 | import tempfile |
53 | 52 | import time |
54 | 53 | import traceback |
55 | | -from concurrent.futures import ThreadPoolExecutor |
| 54 | +from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait |
56 | 55 | from datetime import datetime |
57 | 56 |
|
58 | 57 | import easybuild.tools.environment as env |
@@ -1821,42 +1820,41 @@ def skip_extensions_parallel(self, exts_filter): |
1821 | 1820 |
|
1822 | 1821 | thread_pool = ThreadPoolExecutor(max_workers=self.cfg['parallel']) |
1823 | 1822 |
|
1824 | | - async_shell_cmd_tasks = {} |
1825 | | - running_checks_ids = [] |
| 1823 | + async_shell_cmd_tasks = [] |
1826 | 1824 | installed_exts_ids = [] |
1827 | 1825 | exts_queue = list(enumerate(self.ext_instances[:])) |
1828 | 1826 | checked_exts_cnt = 0 |
1829 | 1827 | exts_cnt = len(self.ext_instances) |
| 1828 | + done_tasks = [] |
1830 | 1829 |
|
1831 | 1830 | # asynchronously run checks to see whether extensions are already installed |
1832 | | - while exts_queue or running_checks_ids: |
| 1831 | + while exts_queue or async_shell_cmd_tasks: |
1833 | 1832 |
|
1834 | 1833 | # first handle completed checks |
1835 | | - for idx in running_checks_ids[:]: |
| 1834 | + for task in done_tasks: |
| 1835 | + async_shell_cmd_tasks.remove(task) |
| 1836 | + res = task.result() |
| 1837 | + idx = res.task_id |
1836 | 1838 | ext_name = self.ext_instances[idx].name |
1837 | | - # check whether command completed |
1838 | | - task = async_shell_cmd_tasks[idx] |
1839 | | - if task.done(): |
1840 | | - res = task.result() |
1841 | | - self.log.info(f"exts_filter result for {ext_name}: exit code {res.exit_code}; output: {res.output}") |
1842 | | - running_checks_ids.remove(idx) |
1843 | | - if res.exit_code == 0: |
1844 | | - print_msg(f"skipping extension {ext_name}", log=self.log) |
1845 | | - installed_exts_ids.append(idx) |
1846 | | - |
1847 | | - checked_exts_cnt += 1 |
1848 | | - exts_pbar_label = "skipping installed extensions " |
1849 | | - exts_pbar_label += "(%d/%d checked)" % (checked_exts_cnt, exts_cnt) |
1850 | | - self.update_exts_progress_bar(exts_pbar_label) |
| 1839 | + self.log.info(f"exts_filter result for {ext_name}: exit code {res.exit_code}; output: {res.output}") |
| 1840 | + if res.exit_code == 0: |
| 1841 | + print_msg(f"skipping extension {ext_name}", log=self.log) |
| 1842 | + installed_exts_ids.append(idx) |
| 1843 | + |
| 1844 | + checked_exts_cnt += 1 |
| 1845 | + exts_pbar_label = "skipping installed extensions " |
| 1846 | + exts_pbar_label += "(%d/%d checked)" % (checked_exts_cnt, exts_cnt) |
| 1847 | + self.update_exts_progress_bar(exts_pbar_label) |
1851 | 1848 |
|
1852 | 1849 | # start additional checks asynchronously |
1853 | 1850 | while exts_queue: |
1854 | 1851 | idx, ext = exts_queue.pop(0) |
1855 | 1852 | cmd, stdin = resolve_exts_filter_template(exts_filter, ext) |
1856 | 1853 | task = thread_pool.submit(run_shell_cmd, cmd, stdin=stdin, hidden=True, |
1857 | | - fail_on_error=False, asynchronous=True) |
1858 | | - async_shell_cmd_tasks[idx] = task |
1859 | | - running_checks_ids.append(idx) |
| 1854 | + fail_on_error=False, asynchronous=True, task_id=idx) |
| 1855 | + async_shell_cmd_tasks.append(task) |
| 1856 | + |
| 1857 | + (done_tasks, _) = wait(async_shell_cmd_tasks, timeout=1, return_when=FIRST_COMPLETED) |
1860 | 1858 |
|
1861 | 1859 | # compose new list of extensions, skip over the ones that are already installed; |
1862 | 1860 | # note: original order in extensions list should be preserved! |
|
0 commit comments