parsl 2025.7.28__py3-none-any.whl → 2025.8.11__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.

Potentially problematic release.


This version of parsl might be problematic. Click here for more details.

Files changed (34) hide show
  1. parsl/dataflow/dflow.py +12 -2
  2. parsl/executors/high_throughput/executor.py +0 -2
  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 +2 -2
  7. parsl/log_utils.py +21 -3
  8. parsl/monitoring/db_manager.py +9 -11
  9. parsl/tests/manual_tests/test_memory_limits.py +1 -1
  10. parsl/tests/site_tests/test_site.py +3 -3
  11. parsl/tests/test_scaling/test_regression_3696_oscillation.py +2 -2
  12. parsl/tests/test_scaling/test_scale_down.py +2 -2
  13. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +2 -2
  14. parsl/tests/test_utils/test_logutils.py +70 -0
  15. parsl/tests/test_utils/test_representation_mixin.py +33 -0
  16. parsl/version.py +1 -1
  17. {parsl-2025.7.28.dist-info → parsl-2025.8.11.dist-info}/METADATA +2 -2
  18. {parsl-2025.7.28.dist-info → parsl-2025.8.11.dist-info}/RECORD +26 -33
  19. parsl/tests/scaling_tests/__init__.py +0 -0
  20. parsl/tests/scaling_tests/htex_local.py +0 -20
  21. parsl/tests/scaling_tests/local_threads.py +0 -4
  22. parsl/tests/scaling_tests/test_scale.py +0 -135
  23. parsl/tests/scaling_tests/vineex_condor.py +0 -9
  24. parsl/tests/scaling_tests/vineex_local.py +0 -10
  25. parsl/tests/scaling_tests/wqex_condor.py +0 -12
  26. parsl/tests/scaling_tests/wqex_local.py +0 -12
  27. {parsl-2025.7.28.data → parsl-2025.8.11.data}/scripts/exec_parsl_function.py +0 -0
  28. {parsl-2025.7.28.data → parsl-2025.8.11.data}/scripts/interchange.py +0 -0
  29. {parsl-2025.7.28.data → parsl-2025.8.11.data}/scripts/parsl_coprocess.py +0 -0
  30. {parsl-2025.7.28.data → parsl-2025.8.11.data}/scripts/process_worker_pool.py +0 -0
  31. {parsl-2025.7.28.dist-info → parsl-2025.8.11.dist-info}/LICENSE +0 -0
  32. {parsl-2025.7.28.dist-info → parsl-2025.8.11.dist-info}/WHEEL +0 -0
  33. {parsl-2025.7.28.dist-info → parsl-2025.8.11.dist-info}/entry_points.txt +0 -0
  34. {parsl-2025.7.28.dist-info → parsl-2025.8.11.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
 
@@ -1139,7 +1142,7 @@ class DataFlowKernel:
1139
1142
  executor.monitoring_messages = self.monitoring.resource_msgs
1140
1143
  logger.debug("Starting monitoring receiver for executor %s "
1141
1144
  "with remote monitoring radio config %s",
1142
- executor, executor.remote_monitoring_radio)
1145
+ executor.label, executor.remote_monitoring_radio)
1143
1146
 
1144
1147
  executor.monitoring_receiver = executor.remote_monitoring_radio.create_receiver(resource_msgs=executor.monitoring_messages,
1145
1148
  run_dir=executor.run_dir)
@@ -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,13 +621,11 @@ 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"""
628
627
  return len(self.tasks)
629
628
 
630
- @property
631
629
  def connected_workers(self) -> int:
632
630
  """Returns the count of workers across all connected managers"""
633
631
  return self.command_client.run("WORKERS")
@@ -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
 
@@ -215,7 +215,7 @@ class Strategy:
215
215
 
216
216
  if hasattr(executor, 'connected_workers'):
217
217
  logger.debug('Executor {} has {} active tasks, {}/{} running/pending blocks, and {} connected workers'.format(
218
- label, active_tasks, running, pending, executor.connected_workers))
218
+ label, active_tasks, running, pending, executor.connected_workers()))
219
219
  else:
220
220
  logger.debug('Executor {} has {} active tasks and {}/{} running/pending blocks'.format(
221
221
  label, active_tasks, running, pending))
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
@@ -18,7 +18,7 @@ from parsl.monitoring.types import MonitoringMessage, TaggedMonitoringMessage
18
18
  from parsl.process_loggers import wrap_with_logs
19
19
  from parsl.utils import setproctitle
20
20
 
21
- logger = logging.getLogger("database_manager")
21
+ logger = logging.getLogger(__name__)
22
22
 
23
23
  X = TypeVar('X')
24
24
 
@@ -293,11 +293,8 @@ class DatabaseManager:
293
293
  self.run_dir = run_dir
294
294
  os.makedirs(self.run_dir, exist_ok=True)
295
295
 
296
- logger.propagate = False
297
-
298
296
  set_file_logger(f"{self.run_dir}/database_manager.log", level=logging_level,
299
- format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s",
300
- name="database_manager")
297
+ format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s")
301
298
 
302
299
  logger.debug("Initializing Database Manager process")
303
300
 
@@ -550,20 +547,21 @@ class DatabaseManager:
550
547
  "or some other error. monitoring data may have been lost"
551
548
  )
552
549
  exception_happened = True
550
+
551
+ if self.external_exit_event.is_set():
552
+ self.close()
553
+
553
554
  if exception_happened:
554
555
  raise RuntimeError("An exception happened sometime during database processing and should have been logged in database_manager.log")
555
556
 
556
- @wrap_with_logs(target="database_manager")
557
- def _migrate_logs_to_internal(self, logs_queue: queue.Queue, kill_event: threading.Event) -> None:
557
+ @wrap_with_logs
558
+ def _migrate_logs_to_internal(self, logs_queue: mpq.Queue, kill_event: threading.Event) -> None:
558
559
  logger.info("Starting _migrate_logs_to_internal")
559
560
 
560
561
  while not kill_event.is_set() or logs_queue.qsize() != 0:
561
562
  logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
562
563
  kill_event.is_set(), logs_queue.qsize() != 0)
563
564
 
564
- if self.external_exit_event.is_set():
565
- self.close()
566
-
567
565
  try:
568
566
  x = logs_queue.get(timeout=0.1)
569
567
  except queue.Empty:
@@ -682,7 +680,7 @@ class DatabaseManager:
682
680
  self._kill_event.set()
683
681
 
684
682
 
685
- @wrap_with_logs(target="database_manager")
683
+ @wrap_with_logs
686
684
  @typeguard.typechecked
687
685
  def dbm_starter(resource_msgs: mpq.Queue,
688
686
  db_url: str,
@@ -53,7 +53,7 @@ def test_simple(mem_per_worker):
53
53
  # Prime a worker
54
54
  double(5).result()
55
55
  dfk = parsl.dfk()
56
- connected = dfk.executors['htex_local'].connected_workers
56
+ connected = dfk.executors['htex_local'].connected_workers()
57
57
  print("Connected : ", connected)
58
58
  assert expected_workers == connected, "Expected {} workers, instead got {} workers".format(expected_workers,
59
59
  connected)
@@ -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
 
@@ -35,8 +35,8 @@ def test_platform(n=2, sleep_dur=10):
35
35
  print([i.result() for i in x])
36
36
 
37
37
  print("Executor : ", dfk.executors[name])
38
- print("Connected : ", dfk.executors[name].connected_workers)
39
- print("Outstanding : ", dfk.executors[name].outstanding)
38
+ print("Connected : ", dfk.executors[name].connected_workers())
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
@@ -9,6 +9,12 @@ class GoodRepr(RepresentationMixin):
9
9
  self.y = y
10
10
 
11
11
 
12
+ class GoodReprDefaults(RepresentationMixin):
13
+ def __init__(self, x, y="default 2"):
14
+ self.x = x
15
+ self.y = y
16
+
17
+
12
18
  class BadRepr(RepresentationMixin):
13
19
  """This class incorrectly subclasses RepresentationMixin.
14
20
  It does not store the parameter x on self.
@@ -31,6 +37,33 @@ def test_repr_good():
31
37
  assert p2 in r
32
38
 
33
39
 
40
+ @pytest.mark.local
41
+ def test_repr_good_defaults_overridden():
42
+ p1 = "parameter 1"
43
+ p2 = "the second parameter"
44
+
45
+ # repr should not raise an exception
46
+ r = repr(GoodReprDefaults(p1, p2))
47
+
48
+ # representation should contain both values supplied
49
+ # at object creation.
50
+ assert p1 in r
51
+ assert p2 in r
52
+
53
+
54
+ @pytest.mark.local
55
+ def test_repr_good_defaults_defaulted():
56
+ p1 = "parameter 1"
57
+
58
+ # repr should not raise an exception
59
+ r = repr(GoodReprDefaults(p1))
60
+
61
+ # representation should contain one value supplied
62
+ # at object creation, and the other defaulted.
63
+ assert p1 in r
64
+ assert "default 2" in r
65
+
66
+
34
67
  @pytest.mark.local
35
68
  def test_repr_bad():
36
69
  p1 = "parameter 1"
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.11'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.28
3
+ Version: 2025.8.11
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.11.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=Sj86K9vmmqykcO7LIlJTAPLTBk827QRiP_ry4rVvJBM,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=uAUD7psp39Je7Mcv70o9_B1fWm27H2Wa5nQhJAoS38c,62974
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=oZGqdbtDy-lDOvV4CgdoFrtukmphRh5tVt31esJdh10,39911
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,13 +110,13 @@ 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=VxFicpEq6l4bkoFQItHCpQGv9-8jPuP_rMLV1yYZ26Q,13805
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
117
117
  parsl/launchers/launchers.py,sha256=cQsNsHuCOL_nQTjPXf0--YsgsDoMoJ77bO1Wt4ncLjs,15134
118
118
  parsl/monitoring/__init__.py,sha256=0ywNz6i0lM1xo_7_BIxhETDGeVd2C_0wwD7qgeaMR4c,83
119
- parsl/monitoring/db_manager.py,sha256=L0c5S9ockq0UIchT2bjmkSAWXS-t0G-Q_neOIBfLbm0,33444
119
+ parsl/monitoring/db_manager.py,sha256=fw71f0l3WTgvSgjSo8NvikI2fWHMFHr3JEnbEFdpGtA,33296
120
120
  parsl/monitoring/errors.py,sha256=VQNIMoo5Ro8GlJ-Ad-6q-YA0y6sTc-IibSdNXZC-GuU,306
121
121
  parsl/monitoring/message_type.py,sha256=Khn88afNxcOIciKiCK4GLnn90I5BlRTiOL3zK-P07yQ,401
122
122
  parsl/monitoring/monitoring.py,sha256=oIXwI_oxan-b1XdTneoza--4uTqYF6ar2X4zWgarGVQ,6602
@@ -253,21 +253,13 @@ parsl/tests/manual_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
253
253
  parsl/tests/manual_tests/htex_local.py,sha256=i3yOiizR1bkEzBfpIBeq-oA3HCTB0KcVUWPJx4XSjpQ,740
254
254
  parsl/tests/manual_tests/test_basic.py,sha256=3uCS9BqaZmKTNtNfJSsJIg2exlTAdC0Sdc1w9hY9Tvc,4023
255
255
  parsl/tests/manual_tests/test_log_filter.py,sha256=jwKclAVuESdlGK_giBuHDkY6ryX6rZB7q01lXT5K0XU,1872
256
- parsl/tests/manual_tests/test_memory_limits.py,sha256=fjQhGsZu1PUl2Z4v75mssqve51QmtVrK94q9zJWQefU,2593
256
+ parsl/tests/manual_tests/test_memory_limits.py,sha256=LWiVs2bjT5SRc6ti5d9QoPzeA7Q5DjiQJ87weSCqzAQ,2595
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=kykFelM7Z78EF0rmS2NRaN-qhXBE9vaSflUGtps-h60,1946
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,7 +444,8 @@ 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
455
- parsl/tests/test_utils/test_representation_mixin.py,sha256=kUZeIDwA2rlbJ3-beGzLLwf3dOplTMCrWJN87etHcyY,1633
447
+ parsl/tests/test_utils/test_logutils.py,sha256=D4ELQ6xmoju7rxPwom3eB6N8JdTwNhUuAuNOfd-lRQE,1470
448
+ parsl/tests/test_utils/test_representation_mixin.py,sha256=8ghhWimkBGzuKExF2Rj5bkILxDCmJmCmRiXiWOEuFxM,2397
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
458
451
  parsl/tests/unit/test_address.py,sha256=0JxaEyvEiLIr5aKvaNnSv0Z9ta3kNllsLS_aby23QPs,716
@@ -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.11.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
460
+ parsl-2025.8.11.data/scripts/interchange.py,sha256=dh9_Q5bLvgHLhSRAXrFIlOd5Yo-ZkudDGFWz0N3hQBg,25951
461
+ parsl-2025.8.11.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
462
+ parsl-2025.8.11.data/scripts/process_worker_pool.py,sha256=-5VLVjeab6oROulx7OwI9tdNNHd6uap45I1jltm-UDc,40524
463
+ parsl-2025.8.11.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
464
+ parsl-2025.8.11.dist-info/METADATA,sha256=oPuf8fgmwnIPvWIV1jDJBvQmcy755wCC-CGa6-emZOo,4055
465
+ parsl-2025.8.11.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
466
+ parsl-2025.8.11.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
467
+ parsl-2025.8.11.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
468
+ parsl-2025.8.11.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
- )