parsl 2025.7.28__py3-none-any.whl → 2025.8.4__py3-none-any.whl

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.
Files changed (31) hide show
  1. parsl/dataflow/dflow.py +11 -1
  2. parsl/executors/high_throughput/executor.py +0 -1
  3. parsl/executors/status_handling.py +1 -1
  4. parsl/executors/taskvine/executor.py +1 -2
  5. parsl/executors/workqueue/executor.py +1 -2
  6. parsl/jobs/strategy.py +1 -1
  7. parsl/log_utils.py +21 -3
  8. parsl/tests/site_tests/test_site.py +2 -2
  9. parsl/tests/test_scaling/test_regression_3696_oscillation.py +2 -2
  10. parsl/tests/test_scaling/test_scale_down.py +2 -2
  11. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +2 -2
  12. parsl/tests/test_utils/test_logutils.py +70 -0
  13. parsl/version.py +1 -1
  14. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/METADATA +2 -2
  15. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/RECORD +23 -30
  16. parsl/tests/scaling_tests/__init__.py +0 -0
  17. parsl/tests/scaling_tests/htex_local.py +0 -20
  18. parsl/tests/scaling_tests/local_threads.py +0 -4
  19. parsl/tests/scaling_tests/test_scale.py +0 -135
  20. parsl/tests/scaling_tests/vineex_condor.py +0 -9
  21. parsl/tests/scaling_tests/vineex_local.py +0 -10
  22. parsl/tests/scaling_tests/wqex_condor.py +0 -12
  23. parsl/tests/scaling_tests/wqex_local.py +0 -12
  24. {parsl-2025.7.28.data → parsl-2025.8.4.data}/scripts/exec_parsl_function.py +0 -0
  25. {parsl-2025.7.28.data → parsl-2025.8.4.data}/scripts/interchange.py +0 -0
  26. {parsl-2025.7.28.data → parsl-2025.8.4.data}/scripts/parsl_coprocess.py +0 -0
  27. {parsl-2025.7.28.data → parsl-2025.8.4.data}/scripts/process_worker_pool.py +0 -0
  28. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/LICENSE +0 -0
  29. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/WHEEL +0 -0
  30. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/entry_points.txt +0 -0
  31. {parsl-2025.7.28.dist-info → parsl-2025.8.4.dist-info}/top_level.txt +0 -0
parsl/dataflow/dflow.py CHANGED
@@ -91,8 +91,11 @@ class DataFlowKernel:
91
91
  self._config = config
92
92
  self.run_dir = make_rundir(config.run_dir)
93
93
 
94
+ self._logging_unregister_callback: Optional[Callable[[], None]]
94
95
  if config.initialize_logging:
95
- parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
96
+ self._logging_unregister_callback = parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
97
+ else:
98
+ self._logging_unregister_callback = None
96
99
 
97
100
  logger.info("Starting DataFlowKernel with config\n{}".format(config))
98
101
 
@@ -1255,6 +1258,13 @@ class DataFlowKernel:
1255
1258
  else:
1256
1259
  logger.debug("Cleaning up non-default DFK - not unregistering")
1257
1260
 
1261
+ if self._logging_unregister_callback:
1262
+ logger.info("Unregistering log handler")
1263
+ self._logging_unregister_callback()
1264
+ logger.info("Unregistered log handler")
1265
+
1266
+ # This message won't go to the default parsl.log, but other handlers
1267
+ # should still see it.
1258
1268
  logger.info("DFK cleanup complete")
1259
1269
 
1260
1270
  def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> str:
@@ -621,7 +621,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
621
621
  self.command_client.run("HOLD_WORKER;{}".format(manager_id))
622
622
  logger.debug("Sent hold request to manager: {}".format(manager_id))
623
623
 
624
- @property
625
624
  def outstanding(self) -> int:
626
625
  """Returns the count of tasks outstanding across the interchange
627
626
  and managers"""
@@ -122,7 +122,7 @@ class BlockProviderExecutor(ParslExecutor):
122
122
  else:
123
123
  return self._provider.status_polling_interval
124
124
 
125
- @abstractproperty
125
+ @abstractmethod
126
126
  def outstanding(self) -> int:
127
127
  """This should return the number of tasks that the executor has been given to run (waiting to run, and running now)"""
128
128
 
@@ -573,7 +573,6 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
573
573
  self._worker_command = self._construct_worker_command()
574
574
  self._patch_providers()
575
575
 
576
- @property
577
576
  def outstanding(self) -> int:
578
577
  """Count the number of outstanding tasks."""
579
578
  logger.debug(f"Counted {self._outstanding_tasks} outstanding tasks")
@@ -659,7 +658,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
659
658
  with self._outstanding_tasks_lock:
660
659
  self._outstanding_tasks -= 1
661
660
  finally:
662
- logger.debug(f"Marking all {self.outstanding} outstanding tasks as failed")
661
+ logger.debug(f"Marking all {self.outstanding()} outstanding tasks as failed")
663
662
  logger.debug("Acquiring tasks_lock")
664
663
  with self._tasks_lock:
665
664
  logger.debug("Acquired tasks_lock")
@@ -674,7 +674,6 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
674
674
  self.worker_command = self._construct_worker_command()
675
675
  self._patch_providers()
676
676
 
677
- @property
678
677
  def outstanding(self) -> int:
679
678
  """Count the number of outstanding slots required. This is inefficiently
680
679
  implemented and probably could be replaced with a counter.
@@ -983,7 +982,7 @@ def _work_queue_submit_wait(*,
983
982
  continue
984
983
  # When a task is found:
985
984
  executor_task_id = t.tag
986
- logger.debug("Completed Work Queue task {}, executor task {}".format(t.id, t.tag))
985
+ logger.info("Completed Work Queue task {}, executor task {}".format(t.id, t.tag))
987
986
  result_file = result_file_of_task_id.pop(t.tag)
988
987
 
989
988
  # A tasks completes 'succesfully' if it has result file.
parsl/jobs/strategy.py CHANGED
@@ -193,7 +193,7 @@ class Strategy:
193
193
  self.executors[label]['first'] = False
194
194
 
195
195
  # Tasks that are either pending completion
196
- active_tasks = executor.outstanding
196
+ active_tasks = executor.outstanding()
197
197
 
198
198
  status = executor.status_facade
199
199
 
parsl/log_utils.py CHANGED
@@ -7,7 +7,7 @@ when working in a Jupyter notebook.
7
7
  """
8
8
  import io
9
9
  import logging
10
- from typing import Optional
10
+ from typing import Callable, Optional
11
11
 
12
12
  import typeguard
13
13
 
@@ -22,7 +22,7 @@ DEFAULT_FORMAT = (
22
22
  def set_stream_logger(name: str = 'parsl',
23
23
  level: int = logging.DEBUG,
24
24
  format_string: Optional[str] = None,
25
- stream: Optional[io.TextIOWrapper] = None) -> None:
25
+ stream: Optional[io.TextIOBase] = None) -> Callable[[], None]:
26
26
  """Add a stream log handler.
27
27
 
28
28
  Args:
@@ -50,12 +50,18 @@ def set_stream_logger(name: str = 'parsl',
50
50
  futures_logger = logging.getLogger("concurrent.futures")
51
51
  futures_logger.addHandler(handler)
52
52
 
53
+ def unregister_callback():
54
+ logger.removeHandler(handler)
55
+ futures_logger.removeHandler(handler)
56
+
57
+ return unregister_callback
58
+
53
59
 
54
60
  @typeguard.typechecked
55
61
  def set_file_logger(filename: str,
56
62
  name: str = 'parsl',
57
63
  level: int = logging.DEBUG,
58
- format_string: Optional[str] = None) -> None:
64
+ format_string: Optional[str] = None) -> Callable[[], None]:
59
65
  """Add a file log handler.
60
66
 
61
67
  Args:
@@ -63,6 +69,12 @@ def set_file_logger(filename: str,
63
69
  - name (string): Logger name
64
70
  - level (logging.LEVEL): Set the logging level.
65
71
  - format_string (string): Set the format string
72
+
73
+ Returns:
74
+ - a callable which, when invoked, will reverse the log handler
75
+ attachments made by this call. (compare to how object based pieces
76
+ of parsl model this as a close/shutdown/cleanup method on the
77
+ object))
66
78
  """
67
79
  if format_string is None:
68
80
  format_string = DEFAULT_FORMAT
@@ -79,3 +91,9 @@ def set_file_logger(filename: str,
79
91
  # concurrent.futures
80
92
  futures_logger = logging.getLogger("concurrent.futures")
81
93
  futures_logger.addHandler(handler)
94
+
95
+ def unregister_callback():
96
+ logger.removeHandler(handler)
97
+ futures_logger.removeHandler(handler)
98
+
99
+ return unregister_callback
@@ -3,7 +3,7 @@ import argparse
3
3
  import pytest
4
4
 
5
5
  import parsl
6
- from parsl.app.app import python_app # , bash_app
6
+ from parsl.app.app import python_app
7
7
  from parsl.tests.site_tests.site_config_selector import fresh_config
8
8
 
9
9
 
@@ -36,7 +36,7 @@ def test_platform(n=2, sleep_dur=10):
36
36
 
37
37
  print("Executor : ", dfk.executors[name])
38
38
  print("Connected : ", dfk.executors[name].connected_workers)
39
- print("Outstanding : ", dfk.executors[name].outstanding)
39
+ print("Outstanding : ", dfk.executors[name].outstanding())
40
40
 
41
41
  d = []
42
42
  for i in range(0, n):
@@ -48,7 +48,7 @@ def test_htex_strategy_does_not_oscillate(ns):
48
48
  statuses = {}
49
49
 
50
50
  executor.provider = provider
51
- executor.outstanding = n_tasks
51
+ executor.outstanding = lambda: n_tasks
52
52
  executor.status_facade = statuses
53
53
  executor.workers_per_node = n_workers
54
54
 
@@ -97,7 +97,7 @@ def test_htex_strategy_does_not_oscillate(ns):
97
97
  # this assert fails due to issue #3696
98
98
 
99
99
  # Now check scale in happens with 0 load
100
- executor.outstanding = 0
100
+ executor.outstanding = lambda: 0
101
101
  s.strategize([executor])
102
102
  executor.scale_in_facade.assert_called()
103
103
  assert len([k for k in statuses if statuses[k].state == JobState.PENDING]) == 0
@@ -66,7 +66,7 @@ def test_scale_out(tmpd_cwd, try_assert):
66
66
  num_managers = len(dfk.executors['htex_local'].connected_managers())
67
67
 
68
68
  assert num_managers == 0, "Expected 0 managers at start"
69
- assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
69
+ assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
70
70
 
71
71
  ntasks = 10
72
72
  ready_path = tmpd_cwd / "workers_ready"
@@ -85,7 +85,7 @@ def test_scale_out(tmpd_cwd, try_assert):
85
85
  finish_path.touch() # Approximation of Event, via files
86
86
  [x.result() for x in futs]
87
87
 
88
- assert dfk.executors['htex_local'].outstanding == 0
88
+ assert dfk.executors['htex_local'].outstanding() == 0
89
89
 
90
90
  def assert_kernel():
91
91
  return len(dfk.executors['htex_local'].connected_managers()) == _min_blocks
@@ -63,7 +63,7 @@ def test_scale_out(tmpd_cwd, try_assert):
63
63
  num_managers = len(dfk.executors['htex_local'].connected_managers())
64
64
 
65
65
  assert num_managers == 0, "Expected 0 managers at start"
66
- assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
66
+ assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
67
67
 
68
68
  ntasks = _max_blocks * 2
69
69
  ready_path = tmpd_cwd / "workers_ready"
@@ -84,7 +84,7 @@ def test_scale_out(tmpd_cwd, try_assert):
84
84
  finish_path.touch() # Approximation of Event, via files
85
85
  [x.result() for x in futs]
86
86
 
87
- assert dfk.executors['htex_local'].outstanding == 0
87
+ assert dfk.executors['htex_local'].outstanding() == 0
88
88
 
89
89
  # now we can launch one "long" task -
90
90
  # and what should happen is that the connected_managers count "eventually" (?) converges to 1 and stays there.
@@ -0,0 +1,70 @@
1
+ import io
2
+ import logging
3
+
4
+ import pytest
5
+
6
+ from parsl.log_utils import set_file_logger, set_stream_logger
7
+
8
+
9
+ @pytest.mark.local
10
+ def test_stream_close():
11
+ """Tests that set_stream_logger callback detaches log handler.
12
+ """
13
+
14
+ logger = logging.getLogger("parsl")
15
+
16
+ s1 = io.StringIO()
17
+ close_callback_1 = set_stream_logger(stream=s1)
18
+ logger.info("AAA")
19
+ close_callback_1()
20
+
21
+ s2 = io.StringIO()
22
+ close_callback_2 = set_stream_logger(stream=s2)
23
+ logger.info("BBB")
24
+ close_callback_2()
25
+
26
+ logger.info("CCC")
27
+
28
+ assert "AAA" in s1.getvalue()
29
+ assert "AAA" not in s2.getvalue()
30
+
31
+ assert "BBB" not in s1.getvalue()
32
+ assert "BBB" in s2.getvalue()
33
+
34
+ assert "CCC" not in s1.getvalue()
35
+ assert "CCC" not in s2.getvalue()
36
+
37
+
38
+ @pytest.mark.local
39
+ def test_file_close(tmpd_cwd):
40
+ """Tests that set_file_Logger callback detaches log handler.
41
+ """
42
+
43
+ logger = logging.getLogger("parsl")
44
+
45
+ f1 = str(tmpd_cwd / "log1")
46
+ close_callback_1 = set_file_logger(filename=f1)
47
+ logger.info("AAA")
48
+ close_callback_1()
49
+
50
+ f2 = str(tmpd_cwd / "log2")
51
+ close_callback_2 = set_file_logger(filename=f2)
52
+ logger.info("BBB")
53
+ close_callback_2()
54
+
55
+ logger.info("CCC")
56
+
57
+ with open(f1, "r") as f:
58
+ s1 = f.read()
59
+
60
+ with open(f2, "r") as f:
61
+ s2 = f.read()
62
+
63
+ assert "AAA" in s1
64
+ assert "AAA" not in s2
65
+
66
+ assert "BBB" not in s1
67
+ assert "BBB" in s2
68
+
69
+ assert "CCC" not in s1
70
+ assert "CCC" not in s2
parsl/version.py CHANGED
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2025.07.28'
6
+ VERSION = '2025.08.04'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.28
3
+ Version: 2025.8.4
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.07.28.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.08.04.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -3,12 +3,12 @@ parsl/addresses.py,sha256=z5GnIWdbzz4klRiMZtX8XmRT7OP8dJYvAk8RIKD2kzI,5290
3
3
  parsl/config.py,sha256=p5HQoxLj5aMagUAYfngcXG2kw0s6SJoc6u7vH2sVhPU,9635
4
4
  parsl/curvezmq.py,sha256=6Zi7RqTP_eKWi3DFgapfK2t-Jw8vJS-ZtN1bsrByPeo,7073
5
5
  parsl/errors.py,sha256=SzINzQFZDBDbj9l-DPQznD0TbGkNhHIRAPkcBCogf_A,1019
6
- parsl/log_utils.py,sha256=k2KTVUWpOfN8-AWSxSwlbD6NyyHCX4uasSBX9__N3wE,2975
6
+ parsl/log_utils.py,sha256=7L3uzvK9ew11pj5D25us-Hs12QTL_jwXNs1LL8dZhOI,3559
7
7
  parsl/multiprocessing.py,sha256=JNAfgdZvQSsxVyUp229OOUqWwf_ZUhpmw8X9CdF3i6k,3614
8
8
  parsl/process_loggers.py,sha256=uQ7Gd0W72Jz7rrcYlOMfLsAEhkRltxXJL2MgdduJjEw,1136
9
9
  parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  parsl/utils.py,sha256=codTX6_KLhgeTwNkRzc1lo4bgc1M93eJ-lkqOO98fvk,14331
11
- parsl/version.py,sha256=yFyALsbXR-ZucBIi4SKO4CajnClMjswTKGJVj9v1-W0,131
11
+ parsl/version.py,sha256=5pN0o1LQOFq0nJT9CXG5Zs6Ui_R2YoLH5yNXtovCNAg,131
12
12
  parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  parsl/app/app.py,sha256=0gbM4AH2OtFOLsv07I5nglpElcwMSOi-FzdZZfrk7So,8532
14
14
  parsl/app/bash.py,sha256=jm2AvePlCT9DZR7H_4ANDWxatp5dN_22FUlT_gWhZ-g,5528
@@ -55,7 +55,7 @@ parsl/data_provider/staging.py,sha256=ZDZuuFg38pjUStegKPcvPsfGp3iMeReMzfU6DSwtJj
55
55
  parsl/data_provider/zip.py,sha256=S4kVuH9lxAegRURYbvIUR7EYYBOccyslaqyCrVWUBhw,4497
56
56
  parsl/dataflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  parsl/dataflow/dependency_resolvers.py,sha256=Om8Dgh7a0ZwgXAc6TlhxLSzvxXHDlNNV1aBNiD3JTNY,3325
58
- parsl/dataflow/dflow.py,sha256=CVjEwikbq2FHJuHhxdVaBYT-WjjmvFOE6H2oo6PKwAE,62485
58
+ parsl/dataflow/dflow.py,sha256=q0nh_GP_4j4zWTOp-q-MbHlfAkgB-2VvpJwEhVL0V4c,62968
59
59
  parsl/dataflow/errors.py,sha256=daVfr2BWs1zRsGD6JtosEMttWHvK1df1Npiu_MUvFKg,3998
60
60
  parsl/dataflow/futures.py,sha256=08LuP-HFiHBIZmeKCjlsazw_WpQ5fwevrU2_WbidkYw,6080
61
61
  parsl/dataflow/memoization.py,sha256=QUkTduZ_gdr8i08VWNWrqhfEvoMGsPDZegWUE2_7sGQ,12579
@@ -67,7 +67,7 @@ parsl/executors/base.py,sha256=Qlc7Qa-jbfGpQcGB29JUFXCdhcSN63bjGubEcbDk270,4948
67
67
  parsl/executors/errors.py,sha256=ZxL3nK5samPos8Xixo_jpRtPIiRJfZ5D397_qaXj2g0,2515
68
68
  parsl/executors/execute_task.py,sha256=PtqHxk778UQaNah1AN-TJV5emZbOcU5TGtWDxFn3_F4,1079
69
69
  parsl/executors/globus_compute.py,sha256=p59iBrv2BvYUAZ3YZSpOrm_Wpai592ueiJm3zFS7gvY,5304
70
- parsl/executors/status_handling.py,sha256=n2DLASEvKZNgFpviAMYDfqcAsxMiU7QxFemw91YSenc,15746
70
+ parsl/executors/status_handling.py,sha256=aRlp0zNrkoaEQEcVoSsk6YNazzHtw0mPYy0GIaEh3qw,15744
71
71
  parsl/executors/threads.py,sha256=lX9VuaMDBg_dqAObKfeaZlYCY4-ti33U-YMWOhWFGTY,4141
72
72
  parsl/executors/flux/__init__.py,sha256=P9grTTeRPXfqXurFhlSS7XhmE6tTbnCnyQ1f9b-oYHE,136
73
73
  parsl/executors/flux/execute_parsl_task.py,sha256=zHP5M7ILGiwnoalZ8WsfVVdZM7uP4iQo2ThVh4crxpM,1530
@@ -75,7 +75,7 @@ parsl/executors/flux/executor.py,sha256=NLdjOli5VjrSdEfyWbfqKN_8APvFkp_qFCouS_9N
75
75
  parsl/executors/flux/flux_instance_manager.py,sha256=5T3Rp7ZM-mlT0Pf0Gxgs5_YmnaPrSF9ec7zvRfLfYJw,2129
76
76
  parsl/executors/high_throughput/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  parsl/executors/high_throughput/errors.py,sha256=k2XuvvFdUfNs2foHFnxmS-BToRMfdXpYEa4EF3ELKq4,1554
78
- parsl/executors/high_throughput/executor.py,sha256=i1XMvB0h40gReWyD4ID14VxdF-Pftl4iGa9vyxC6nKQ,39939
78
+ parsl/executors/high_throughput/executor.py,sha256=Olg0NMmg8UCj65zSk51I65c9NTerggLGba8T59aqidM,39925
79
79
  parsl/executors/high_throughput/interchange.py,sha256=R6zcY7yh1daMJR8Ke8o9QCj8AtkH7lwzECS0MAWugvA,25964
80
80
  parsl/executors/high_throughput/manager_record.py,sha256=ZMsqFxvreGLRXAw3N-JnODDa9Qfizw2tMmcBhm4lco4,490
81
81
  parsl/executors/high_throughput/manager_selector.py,sha256=UKcUE6v0tO7PDMTThpKSKxVpOpOUilxDL7UbNgpZCxo,2116
@@ -93,7 +93,7 @@ parsl/executors/radical/rpex_worker.py,sha256=z6r82ZujKb6sdKIdHsQ_5EBMDIQieeGcrl
93
93
  parsl/executors/taskvine/__init__.py,sha256=9rwp3M8B0YyEhZMLO0RHaNw7u1nc01WHbXLqnBTanu0,293
94
94
  parsl/executors/taskvine/errors.py,sha256=euIYkSslrNSI85kyi2s0xzOaO9ik4c1fYHstMIeiBJk,652
95
95
  parsl/executors/taskvine/exec_parsl_function.py,sha256=ftGdJU78lKPPkphSHlEi4rj164mhuMHJjghVqfgeXKk,7085
96
- parsl/executors/taskvine/executor.py,sha256=AXLQZHhibGpApddq8CvEVObWBS91F_dpzIz61nc19co,31326
96
+ parsl/executors/taskvine/executor.py,sha256=VBQ5wNA2t4n2tWyvEAo-T_eu84F6Q2CHsIZhorS93D4,31314
97
97
  parsl/executors/taskvine/factory.py,sha256=GU5JryEAKJuYKwrSc162BN-lhcKhapvBZHT820pxwic,2772
98
98
  parsl/executors/taskvine/factory_config.py,sha256=ZQC5vyDe8cM0nuv7fbBCV2xnWGAZ87iLlT2UqmFFI1U,3695
99
99
  parsl/executors/taskvine/manager.py,sha256=2GKpw9bnA2NQmti1AACZ6gHRVa8MN88NBk6j5VyTUIY,25935
@@ -102,7 +102,7 @@ parsl/executors/taskvine/utils.py,sha256=iSrIogeiauL3UNy_9tiZp1cBSNn6fIJkMYQRVi1
102
102
  parsl/executors/workqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
103
  parsl/executors/workqueue/errors.py,sha256=XO2naYhAsHHyiOBH6hpObg3mPNDmvMoFqErsj0-v7jc,541
104
104
  parsl/executors/workqueue/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
105
- parsl/executors/workqueue/executor.py,sha256=PpJVu4Fa12bqnhE4gkFtXtjYjjMOAuCsyuKFmYsBn4I,50203
105
+ parsl/executors/workqueue/executor.py,sha256=U5l3Xx2FvTPe5r7hIiSvjW8H_54YFX7q3acqr3Ilprk,50188
106
106
  parsl/executors/workqueue/parsl_coprocess.py,sha256=cF1UmTgVLoey6QzBcbYgEiEsRidSaFfuO54f1HFw_EM,5737
107
107
  parsl/executors/workqueue/parsl_coprocess_stub.py,sha256=_bJmpPIgL42qM6bVzeEKt1Mn1trSP41rtJguXxPGfHI,735
108
108
  parsl/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -110,7 +110,7 @@ parsl/jobs/error_handlers.py,sha256=BBXwUAMJpBm0HxV1P-I6jv7ZF9wcrhnCfzSTlsd2g4w,
110
110
  parsl/jobs/errors.py,sha256=cpSQXCrlKtuHsQf7usjF-lX8XsDkFnE5kWpmFjiN6OU,178
111
111
  parsl/jobs/job_status_poller.py,sha256=b37JOqDpSesqeSreEh1HzfVTFnD5Aoy6k8JDXkkPDmk,2192
112
112
  parsl/jobs/states.py,sha256=dUM8gC4YVpUjLMARJJ_tDERs6oHsoNheAtG6JWPIJt4,5058
113
- parsl/jobs/strategy.py,sha256=wQk5q-K0adh1oZFI9Mei2iASLRQ8khup1ebiZD-4xfQ,13801
113
+ parsl/jobs/strategy.py,sha256=m5iKxp3KWWYuo4SMyi1vjxOi-En5KU6bJEIcn1UVoQc,13803
114
114
  parsl/launchers/__init__.py,sha256=jJeDOWGKJjvpmWTLsj1zSqce_UAhWRc_IO-TzaOAlII,579
115
115
  parsl/launchers/base.py,sha256=CblcvPTJiu-MNLWaRtFe29SZQ0BpTOlaY8CGcHdlHIE,538
116
116
  parsl/launchers/errors.py,sha256=8YMV_CHpBNVa4eXkGE4x5DaFQlZkDCRCHmBktYcY6TA,467
@@ -256,18 +256,10 @@ parsl/tests/manual_tests/test_log_filter.py,sha256=jwKclAVuESdlGK_giBuHDkY6ryX6r
256
256
  parsl/tests/manual_tests/test_memory_limits.py,sha256=fjQhGsZu1PUl2Z4v75mssqve51QmtVrK94q9zJWQefU,2593
257
257
  parsl/tests/manual_tests/test_regression_220.py,sha256=Jo2puWt1W0r1rJfaJFgd2ZPgR3i6uOXzrLRcfYDZWDo,931
258
258
  parsl/tests/manual_tests/test_worker_count.py,sha256=Cv8nAWMXAREiiGEBUr_8JyI87ffp8JGAyDqVXzcjX_0,2072
259
- parsl/tests/scaling_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
- parsl/tests/scaling_tests/htex_local.py,sha256=opgR-l18aunWeReuqBvNP7nSAk8CpsYqhAZE9PNPV8M,483
261
- parsl/tests/scaling_tests/local_threads.py,sha256=RbqOr2ELWBDFwmCCbvmyd4zEJDvonQGRbs7Apc6cy9g,138
262
- parsl/tests/scaling_tests/test_scale.py,sha256=Lmrp0L8ndzhXb4imhtjz5m0Ru7AJLto4bKE58CJDOfs,3472
263
- parsl/tests/scaling_tests/vineex_condor.py,sha256=xQvn5w7zmWxNlxdxVDd951lW6Y1d4SC2x9tNLFRDcI4,348
264
- parsl/tests/scaling_tests/vineex_local.py,sha256=pPluQtOW7DblCGGCzm_LFbvqwAVq0uaKy1BvmTpBttc,402
265
- parsl/tests/scaling_tests/wqex_condor.py,sha256=hMo1hK8aj-L36vj0PoByQvL9YQTVrenLn5UHiMXKIkc,547
266
- parsl/tests/scaling_tests/wqex_local.py,sha256=C-eYESKhi4V4XZuHLO0lgP5rovEj8LNYGJOHLpUDdOM,545
267
259
  parsl/tests/site_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
268
260
  parsl/tests/site_tests/site_config_selector.py,sha256=cpToBNdvHZPOxYfiFpGVuydSMlmxfeo27N3VEjRFLgw,1815
269
261
  parsl/tests/site_tests/test_provider.py,sha256=o9pUn_qzQnUSnuh-OQGBec_dNrmOVTD79-i27p_K-N8,2696
270
- parsl/tests/site_tests/test_site.py,sha256=03vqVbtZHXH_D4S49vrrgH1-SlHkMI0zlNe7losf7bY,1956
262
+ parsl/tests/site_tests/test_site.py,sha256=9_CKR8gVoIq0v3g-XJmSLuFhi53K56Ufqjb8XC0WM1c,1944
271
263
  parsl/tests/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
264
  parsl/tests/sites/test_affinity.py,sha256=CCfYxSkpoznREGV2-K2As4YbsMY7bCiYqRMZkUp-zO0,1500
273
265
  parsl/tests/sites/test_concurrent.py,sha256=ybHOnIsRyYs2tFPggv2ivRVoqH8Ts4PTEvb4IN3Obv8,1219
@@ -413,9 +405,9 @@ parsl/tests/test_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
413
405
  parsl/tests/test_scaling/test_block_error_handler.py,sha256=OS1IyiK8gjRFI1VzpmOvEnKsPev2vKmC6Z2Hp5LaHpA,6068
414
406
  parsl/tests/test_scaling/test_regression_1621.py,sha256=e3-bkHR3d8LxA-uY0BugyWgYzksh00I_UbaA-jHOzKY,1872
415
407
  parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py,sha256=bjE_NIBoWK6heEz5LN0tzE1977vUA9kVemAYCqcIbzY,2942
416
- parsl/tests/test_scaling/test_regression_3696_oscillation.py,sha256=7Xc3vgocXXUbUegh9t5OyXlV91lRXDVMUlrOwErYOXA,3621
417
- parsl/tests/test_scaling/test_scale_down.py,sha256=GmxzNtlG13SySVDGGlSqXEnaHxyCx6ZVn_Hi1GcBvj8,2765
418
- parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py,sha256=EnVNllKO2AGKkGa6927cLrzvvG6mpNQeFDzVktv6x08,4521
408
+ parsl/tests/test_scaling/test_regression_3696_oscillation.py,sha256=xbRY1sNmPvpliwg0nLDCS2JcIviVPHHCOe3y1W9iIlY,3637
409
+ parsl/tests/test_scaling/test_scale_down.py,sha256=q_H6YAaID-n6Yj_FVElhufApzsbD08ItRopjgRBlDvU,2769
410
+ parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py,sha256=2w4BxKyWXrow9PMRZzIFdiB1EVZ8YRTmqsP-RNoOx7Q,4525
419
411
  parsl/tests/test_scaling/test_scale_down_htex_unregistered.py,sha256=OrdnYmd58n7UfkANPJ7mzha4WSCPdbgJRX1O1Zdu0tI,1954
420
412
  parsl/tests/test_scaling/test_shutdown_scalein.py,sha256=sr40of5DwxeyQI97MDZxFqJILZSXZJb9Dv7qTf2gql8,2471
421
413
  parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py,sha256=wDv6JD-4OZ70Hw8pfOd12wOKzGtTuAsSqjoy-4tBV0k,2738
@@ -452,6 +444,7 @@ parsl/tests/test_threads/test_configs.py,sha256=POwCKY4FMkI5-RSFz77cQYC7R_ISj0iA
452
444
  parsl/tests/test_threads/test_lazy_errors.py,sha256=6dJ65py5vUZkc0aRLL-LHuxBBp877Ktghb_jFDZsE98,543
453
445
  parsl/tests/test_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
454
446
  parsl/tests/test_utils/test_execute_wait.py,sha256=J796rGuv2qi2spChgAPFB1oPETdnvdLOplpErDlOwL8,880
447
+ parsl/tests/test_utils/test_logutils.py,sha256=D4ELQ6xmoju7rxPwom3eB6N8JdTwNhUuAuNOfd-lRQE,1470
455
448
  parsl/tests/test_utils/test_representation_mixin.py,sha256=kUZeIDwA2rlbJ3-beGzLLwf3dOplTMCrWJN87etHcyY,1633
456
449
  parsl/tests/test_utils/test_sanitize_dns.py,sha256=8P_v5a5JLGU76OYf0LtclAwqJxGU0fMh_OZMVkMke3I,2954
457
450
  parsl/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -463,13 +456,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
463
456
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
464
457
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
465
458
  parsl/usage_tracking/usage.py,sha256=hbMo5BYgIWqMcFWqN-HYP1TbwNrTonpv-usfwnCFJKY,9212
466
- parsl-2025.7.28.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
467
- parsl-2025.7.28.data/scripts/interchange.py,sha256=dh9_Q5bLvgHLhSRAXrFIlOd5Yo-ZkudDGFWz0N3hQBg,25951
468
- parsl-2025.7.28.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
469
- parsl-2025.7.28.data/scripts/process_worker_pool.py,sha256=-5VLVjeab6oROulx7OwI9tdNNHd6uap45I1jltm-UDc,40524
470
- parsl-2025.7.28.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
471
- parsl-2025.7.28.dist-info/METADATA,sha256=gsr5RQIk_sAza93k5y9gCYVycf6KhKAIF2b8wnaRiSc,4055
472
- parsl-2025.7.28.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
473
- parsl-2025.7.28.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
474
- parsl-2025.7.28.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
475
- parsl-2025.7.28.dist-info/RECORD,,
459
+ parsl-2025.8.4.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
460
+ parsl-2025.8.4.data/scripts/interchange.py,sha256=dh9_Q5bLvgHLhSRAXrFIlOd5Yo-ZkudDGFWz0N3hQBg,25951
461
+ parsl-2025.8.4.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
462
+ parsl-2025.8.4.data/scripts/process_worker_pool.py,sha256=-5VLVjeab6oROulx7OwI9tdNNHd6uap45I1jltm-UDc,40524
463
+ parsl-2025.8.4.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
464
+ parsl-2025.8.4.dist-info/METADATA,sha256=Z-Ljcajho6y34ACO7zbu2YtbMlMyc4pZ8YCE2us203A,4054
465
+ parsl-2025.8.4.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
466
+ parsl-2025.8.4.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
467
+ parsl-2025.8.4.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
468
+ parsl-2025.8.4.dist-info/RECORD,,
File without changes
@@ -1,20 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import HighThroughputExecutor
3
- from parsl.providers import LocalProvider
4
-
5
- # import os
6
- config = Config(
7
- executors=[
8
- HighThroughputExecutor(
9
- label="htex_local",
10
- cores_per_worker=1,
11
- max_workers_per_node=8,
12
- encrypted=True,
13
- provider=LocalProvider(
14
- init_blocks=1,
15
- max_blocks=1,
16
- ),
17
- )
18
- ],
19
- strategy='none',
20
- )
@@ -1,4 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.threads import ThreadPoolExecutor
3
-
4
- config = Config(executors=[ThreadPoolExecutor()])
@@ -1,135 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- import argparse
4
- import time
5
-
6
- import parsl
7
- from parsl.app.app import python_app # , bash_app
8
-
9
-
10
- @python_app
11
- def double(x):
12
- return x * 2
13
-
14
-
15
- @python_app
16
- def echo(x, string, stdout=None):
17
- print(string)
18
- return x * 5
19
-
20
-
21
- @python_app
22
- def import_echo(x, string, stdout=None):
23
- # from time import sleep
24
- # sleep(0)
25
- print(string)
26
- return x * 5
27
-
28
-
29
- @python_app
30
- def platform(sleep=10, stdout=None):
31
- import platform
32
- import time
33
- time.sleep(sleep)
34
- return platform.uname()
35
-
36
-
37
- def test_simple(n=2):
38
- start = time.time()
39
- x = double(n)
40
- print("Result : ", x.result())
41
- assert x.result() == n * \
42
- 2, "Expected double to return:{0} instead got:{1}".format(
43
- n * 2, x.result())
44
- print("Duration : {0}s".format(time.time() - start))
45
- print("[TEST STATUS] test_parallel_for [SUCCESS]")
46
- return True
47
-
48
-
49
- def test_imports(n=2):
50
- start = time.time()
51
- x = import_echo(n, "hello world")
52
- print("Result : ", x.result())
53
- assert x.result() == n * \
54
- 5, "Expected double to return:{0} instead got:{1}".format(
55
- n * 2, x.result())
56
- print("Duration : {0}s".format(time.time() - start))
57
- print("[TEST STATUS] test_parallel_for [SUCCESS]")
58
- return True
59
-
60
-
61
- def test_platform(n=2, sleep=1):
62
-
63
- dfk = parsl.dfk()
64
- # sync
65
- x = platform(sleep=0)
66
- print(x.result())
67
-
68
- name = list(dfk.executors.keys())[0]
69
- print("Trying to get executor : ", name)
70
-
71
- print("Executor : ", dfk.executors[name])
72
- print("Connected : ", dfk.executors[name].connected_workers)
73
- print("Outstanding : ", dfk.executors[name].outstanding)
74
- d = []
75
- for i in range(0, n):
76
- x = platform(sleep=sleep)
77
- d.append(x)
78
-
79
- print("Connected : ", dfk.executors[name].connected_workers)
80
- print("Outstanding : ", dfk.executors[name].outstanding)
81
-
82
- print(set([i.result()for i in d]))
83
-
84
- print("Connected : ", dfk.executors[name].connected_workers)
85
- print("Outstanding : ", dfk.executors[name].outstanding)
86
-
87
- return True
88
-
89
-
90
- def test_parallel_for(n=2, sleep=1):
91
- d = {}
92
-
93
- start = time.time()
94
- print("Priming ...")
95
- double(10).result()
96
- delta = time.time() - start
97
- print("Priming done in {} seconds".format(delta))
98
-
99
- start = time.time()
100
- for i in range(0, n):
101
- d[i] = platform(sleep=sleep)
102
- # d[i] = double(i)
103
- # time.sleep(0.01)
104
- [d[i].result() for i in d]
105
- delta = time.time() - start
106
- print("Time to complete {} tasks: {:8.3f} s".format(n, delta))
107
- print("Throughput : {:8.3f} Tasks/s".format(n / delta))
108
- return d
109
-
110
-
111
- if __name__ == '__main__':
112
-
113
- parser = argparse.ArgumentParser()
114
- parser.add_argument("-s", "--sleep", default="0")
115
- parser.add_argument("-c", "--count", default="10",
116
- help="Count of apps to launch")
117
- parser.add_argument("-d", "--debug", action='store_true',
118
- help="Count of apps to launch")
119
- parser.add_argument("-f", "--fileconfig", required=True)
120
-
121
- args = parser.parse_args()
122
-
123
- if args.debug:
124
- parsl.set_stream_logger()
125
-
126
- config = None
127
- exec("from {} import config".format(args.fileconfig))
128
- parsl.load(config)
129
- # x = test_simple(int(args.count))
130
- # x = test_imports()
131
- x = test_parallel_for(int(args.count), float(args.sleep))
132
- # x = test_platform(int(args.count), int(args.sleep))
133
- # x = test_parallel_for(int(args.count))
134
- # x = test_stdout()
135
- # x = test_platform()
@@ -1,9 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
3
- from parsl.providers import CondorProvider
4
-
5
- config = Config(
6
- executors=[TaskVineExecutor(manager_config=TaskVineManagerConfig(port=50055),
7
- provider=CondorProvider(),
8
- )]
9
- )
@@ -1,10 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
3
- from parsl.providers import LocalProvider
4
-
5
- config = Config(
6
- executors=[TaskVineExecutor(label='VineExec',
7
- worker_launch_method='factory',
8
- manager_config=TaskVineManagerConfig(port=50055),
9
- )]
10
- )
@@ -1,12 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import WorkQueueExecutor
3
- from parsl.providers import CondorProvider
4
-
5
- config = Config(
6
- executors=[WorkQueueExecutor(port=50055,
7
- source=True,
8
- provider=CondorProvider(),
9
- # init_command='source /home/yadu/src/wq_parsl/setup_parsl_env.sh;
10
- # echo "Ran at $date" > /home/yadu/src/wq_parsl/parsl/tests/workqueue_tests/ran.log',
11
- )]
12
- )
@@ -1,12 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import WorkQueueExecutor
3
- from parsl.providers import LocalProvider
4
-
5
- config = Config(
6
- executors=[WorkQueueExecutor(port=50055,
7
- source=True,
8
- provider=LocalProvider(),
9
- # init_command='source /home/yadu/src/wq_parsl/setup_parsl_env.sh;
10
- # echo "Ran at $date" > /home/yadu/src/wq_parsl/parsl/tests/workqueue_tests/ran.log',
11
- )]
12
- )