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

parsl/dataflow/dflow.py CHANGED
@@ -375,6 +375,7 @@ class DataFlowKernel:
375
375
  logger.info("Task {} failed due to dependency failure so skipping retries".format(task_id))
376
376
  task_record['time_returned'] = datetime.datetime.now()
377
377
  self._send_task_log_info(task_record)
378
+ self.memoizer.update_memo(task_record)
378
379
  with task_record['app_fu']._update_lock:
379
380
  task_record['app_fu'].set_exception(e)
380
381
 
@@ -400,6 +401,7 @@ class DataFlowKernel:
400
401
  self.update_task_state(task_record, States.failed)
401
402
  task_record['time_returned'] = datetime.datetime.now()
402
403
  self._send_task_log_info(task_record)
404
+ self.memoizer.update_memo(task_record)
403
405
  with task_record['app_fu']._update_lock:
404
406
  task_record['app_fu'].set_exception(e)
405
407
 
@@ -446,6 +448,7 @@ class DataFlowKernel:
446
448
  self.update_task_state(task_record, States.failed)
447
449
  task_record['time_returned'] = datetime.datetime.now()
448
450
  self._send_task_log_info(task_record)
451
+ self.memoizer.update_memo(task_record)
449
452
  with task_record['app_fu']._update_lock:
450
453
  task_record['app_fu'].set_exception(
451
454
  TypeError(f"join_app body must return a Future or list of Futures, got {joinable} of type {type(joinable)}"))
@@ -521,6 +524,7 @@ class DataFlowKernel:
521
524
 
522
525
  self.update_task_state(task_record, States.failed)
523
526
  task_record['time_returned'] = datetime.datetime.now()
527
+ self.memoizer.update_memo(task_record)
524
528
  with task_record['app_fu']._update_lock:
525
529
  task_record['app_fu'].set_exception(e)
526
530
 
@@ -561,8 +565,6 @@ class DataFlowKernel:
561
565
  if not task_record['app_fu'] == future:
562
566
  logger.error("Internal consistency error: callback future is not the app_fu in task structure, for task {}".format(task_id))
563
567
 
564
- self.memoizer.update_memo(task_record)
565
-
566
568
  # Cover all checkpointing cases here:
567
569
  # Do we need to checkpoint now, or queue for later,
568
570
  # or do nothing?
@@ -591,6 +593,7 @@ class DataFlowKernel:
591
593
  logger.info(f"Task {task_record['id']} completed ({old_state.name} -> {new_state.name})")
592
594
  task_record['time_returned'] = datetime.datetime.now()
593
595
 
596
+ self.memoizer.update_memo(task_record)
594
597
  with task_record['app_fu']._update_lock:
595
598
  task_record['app_fu'].set_result(result)
596
599
 
@@ -160,6 +160,12 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
160
160
  """ # Documentation for params used by both HTEx and MPIEx
161
161
 
162
162
 
163
+ class HTEXFuture(Future):
164
+ def __init__(self, task_id) -> None:
165
+ super().__init__()
166
+ self.parsl_executor_task_id = task_id
167
+
168
+
163
169
  class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
164
170
  __doc__ = f"""Executor designed for cluster-scale
165
171
 
@@ -670,7 +676,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
670
676
  logger.debug("Sending hold to manager: {}".format(manager['manager']))
671
677
  self._hold_manager(manager['manager'])
672
678
 
673
- def submit(self, func, resource_specification, *args, **kwargs):
679
+ def submit(self, func: Callable, resource_specification: dict, *args, **kwargs) -> HTEXFuture:
674
680
  """Submits work to the outgoing_q.
675
681
 
676
682
  The outgoing_q is an external process listens on this
@@ -691,21 +697,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
691
697
 
692
698
  self.validate_resource_spec(resource_specification)
693
699
 
694
- if self.bad_state_is_set:
695
- raise self.executor_exception
696
-
697
- self._task_counter += 1
698
- task_id = self._task_counter
699
-
700
700
  # handle people sending blobs gracefully
701
701
  if logger.getEffectiveLevel() <= logging.DEBUG:
702
702
  args_to_print = tuple([ar if len(ar := repr(arg)) < 100 else (ar[:100] + '...') for arg in args])
703
703
  logger.debug("Pushing function {} to queue with args {}".format(func, args_to_print))
704
704
 
705
- fut = Future()
706
- fut.parsl_executor_task_id = task_id
707
- self.tasks[task_id] = fut
708
-
709
705
  try:
710
706
  fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
711
707
  except TypeError:
@@ -715,12 +711,69 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
715
711
  if resource_specification:
716
712
  context["resource_spec"] = resource_specification
717
713
 
718
- msg = {"task_id": task_id, "context": context, "buffer": fn_buf}
714
+ return self.submit_payload(context, fn_buf)
715
+
716
+ def submit_payload(self, context: dict, buffer: bytes) -> HTEXFuture:
717
+ """
718
+ Submit specially crafted payloads.
719
+
720
+ For use-cases where the ``HighThroughputExecutor`` consumer needs the payload
721
+ handled by the worker in a special way. For example, if the function is
722
+ serialized differently than Parsl's default approach, or if the task must
723
+ be setup more precisely than Parsl's default ``execute_task`` allows.
724
+
725
+ An example interaction:
726
+
727
+ .. code-block: python
728
+
729
+ >>> htex: HighThroughputExecutor # setup prior to this example
730
+ >>> ctxt = {
731
+ ... "task_executor": {
732
+ ... "f": "full.import.path.of.custom_execute_task",
733
+ ... "a": ("additional", "arguments"),
734
+ ... "k": {"some": "keyword", "args": "here"}
735
+ ... }
736
+ ... }
737
+ >>> fn_buf = custom_serialize(task_func, *task_args, **task_kwargs)
738
+ >>> fut = htex.submit_payload(ctxt, fn_buf)
739
+
740
+ The custom ``custom_execute_task`` would be dynamically imported, and
741
+ invoked as:
742
+
743
+ .. code-block: python
744
+
745
+ args = ("additional", "arguments")
746
+ kwargs = {"some": "keyword", "args": "here"}
747
+ result = custom_execute_task(fn_buf, *args, **kwargs)
748
+
749
+ Parameters
750
+ ----------
751
+ context:
752
+ A task-specific context associated with the function buffer. Parsl
753
+ currently implements the keys ``task_executor`` and ``resource_spec``
754
+
755
+ buffer:
756
+ A serialized function, that will be deserialized and executed by
757
+ ``execute_task`` (or custom function, if ``task_executor`` is specified)
758
+
759
+ Returns
760
+ -------
761
+ An HTEXFuture (a normal Future, with the attribute ``.parsl_executor_task_id``
762
+ set). The future will be set to done when the associated function buffer has
763
+ been invoked and completed.
764
+ """
765
+ if self.bad_state_is_set:
766
+ raise self.executor_exception
767
+
768
+ self._task_counter += 1
769
+ task_id = self._task_counter
770
+
771
+ fut = HTEXFuture(task_id)
772
+ self.tasks[task_id] = fut
719
773
 
720
- # Post task to the outgoing queue
774
+ msg = {"task_id": task_id, "context": context, "buffer": buffer}
721
775
  self.outgoing_q.put(msg)
722
776
 
723
- # Return the future
724
777
  return fut
725
778
 
726
779
  @property
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
3
  import argparse
4
+ import importlib
4
5
  import logging
5
6
  import math
6
7
  import multiprocessing
@@ -17,7 +18,7 @@ from importlib.metadata import distributions
17
18
  from multiprocessing.context import SpawnProcess
18
19
  from multiprocessing.managers import DictProxy
19
20
  from multiprocessing.sharedctypes import Synchronized
20
- from typing import Dict, List, Optional, Sequence
21
+ from typing import Callable, Dict, List, Optional, Sequence
21
22
 
22
23
  import psutil
23
24
  import zmq
@@ -778,8 +779,20 @@ def worker(
778
779
 
779
780
  _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
780
781
 
782
+ exec_func: Callable = execute_task
783
+ exec_args = ()
784
+ exec_kwargs = {}
785
+
781
786
  try:
782
- result = execute_task(req['buffer'])
787
+ if task_executor := ctxt.get("task_executor", None):
788
+ mod_name, _, fn_name = task_executor["f"].rpartition(".")
789
+ exec_mod = importlib.import_module(mod_name)
790
+ exec_func = getattr(exec_mod, fn_name)
791
+
792
+ exec_args = task_executor.get("a", ())
793
+ exec_kwargs = task_executor.get("k", {})
794
+
795
+ result = exec_func(req['buffer'], *exec_args, **exec_kwargs)
783
796
  serialized_result = serialize(result, buffer_threshold=1000000)
784
797
  except Exception as e:
785
798
  logger.info('Caught an exception: {}'.format(e))
@@ -5,7 +5,6 @@ from parsl.dataflow.dflow import DataFlowKernel
5
5
 
6
6
 
7
7
  def run_checkpointed(checkpoints):
8
- # set_stream_logger()
9
8
  from parsl.tests.configs.local_threads_checkpoint_task_exit import config
10
9
  config.checkpoint_files = checkpoints
11
10
  dfk = DataFlowKernel(config=config)
@@ -7,6 +7,7 @@ from unittest import mock
7
7
  import pytest
8
8
 
9
9
  from parsl import HighThroughputExecutor, curvezmq
10
+ from parsl.serialize.facade import pack_apply_message, unpack_apply_message
10
11
 
11
12
  _MOCK_BASE = "parsl.executors.high_throughput.executor"
12
13
 
@@ -19,11 +20,16 @@ def encrypted(request: pytest.FixtureRequest):
19
20
 
20
21
 
21
22
  @pytest.fixture
22
- def htex(encrypted: bool):
23
+ def htex(encrypted: bool, tmpd_cwd):
23
24
  htex = HighThroughputExecutor(encrypted=encrypted)
25
+ htex.max_workers_per_node = 1
26
+ htex.run_dir = tmpd_cwd
27
+ htex.provider.script_dir = tmpd_cwd
24
28
 
25
29
  yield htex
26
30
 
31
+ if hasattr(htex, "outgoing_q"):
32
+ htex.scale_in(blocks=1000)
27
33
  htex.shutdown()
28
34
 
29
35
 
@@ -146,3 +152,32 @@ def test_htex_interchange_launch_cmd(cmd: Optional[Sequence[str]]):
146
152
  else:
147
153
  htex = HighThroughputExecutor()
148
154
  assert htex.interchange_launch_cmd == ["interchange.py"]
155
+
156
+
157
+ def dyn_exec(buf, *vec_y):
158
+ f, a, _ = unpack_apply_message(buf)
159
+ custom_args = [a, vec_y]
160
+ return f(*custom_args)
161
+
162
+
163
+ @pytest.mark.local
164
+ def test_worker_dynamic_import(htex: HighThroughputExecutor):
165
+ def _dot_prod(vec_x, vec_y):
166
+ return sum(x * y for x, y in zip(vec_x, vec_y))
167
+
168
+ htex.start()
169
+ htex.scale_out_facade(1)
170
+
171
+ num_array = tuple(range(10))
172
+
173
+ fn_buf = pack_apply_message(_dot_prod, num_array, {})
174
+ ctxt = {
175
+ "task_executor": {
176
+ "f": f"{dyn_exec.__module__}.{dyn_exec.__name__}",
177
+ "a": num_array, # prove "custom" dyn_exec
178
+ }
179
+ }
180
+ val = htex.submit_payload(ctxt, fn_buf).result()
181
+ exp_val = _dot_prod(num_array, num_array)
182
+
183
+ assert val == exp_val
@@ -27,10 +27,5 @@ def test_garbage_collect():
27
27
 
28
28
  evt.set()
29
29
  assert x.result() == 10 * 4
30
- if parsl.dfk().checkpoint_mode is not None:
31
- # We explicit call checkpoint if checkpoint_mode is enabled covering
32
- # cases like manual/periodic where checkpointing may be deferred.
33
- parsl.dfk().checkpoint()
34
-
35
- time.sleep(0.01) # Give enough time for task wipes to work
30
+ time.sleep(0.01) # Give enough time for task wipes to work - see issue #1279
36
31
  assert x.tid not in parsl.dfk().tasks, "Task record should be wiped after task completion"
@@ -4,7 +4,17 @@ import pytest
4
4
 
5
5
  import parsl
6
6
  from parsl.app.app import python_app
7
- from parsl.tests.configs.local_threads_no_cache import fresh_config as local_config
7
+ from parsl.config import Config
8
+ from parsl.executors.threads import ThreadPoolExecutor
9
+
10
+
11
+ def local_config():
12
+ return Config(
13
+ executors=[
14
+ ThreadPoolExecutor(max_threads=4),
15
+ ],
16
+ app_cache=False
17
+ )
8
18
 
9
19
 
10
20
  @python_app
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.09.29'
6
+ VERSION = '2025.10.06'
@@ -1,6 +1,7 @@
1
1
  #!python
2
2
 
3
3
  import argparse
4
+ import importlib
4
5
  import logging
5
6
  import math
6
7
  import multiprocessing
@@ -17,7 +18,7 @@ from importlib.metadata import distributions
17
18
  from multiprocessing.context import SpawnProcess
18
19
  from multiprocessing.managers import DictProxy
19
20
  from multiprocessing.sharedctypes import Synchronized
20
- from typing import Dict, List, Optional, Sequence
21
+ from typing import Callable, Dict, List, Optional, Sequence
21
22
 
22
23
  import psutil
23
24
  import zmq
@@ -778,8 +779,20 @@ def worker(
778
779
 
779
780
  _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
780
781
 
782
+ exec_func: Callable = execute_task
783
+ exec_args = ()
784
+ exec_kwargs = {}
785
+
781
786
  try:
782
- result = execute_task(req['buffer'])
787
+ if task_executor := ctxt.get("task_executor", None):
788
+ mod_name, _, fn_name = task_executor["f"].rpartition(".")
789
+ exec_mod = importlib.import_module(mod_name)
790
+ exec_func = getattr(exec_mod, fn_name)
791
+
792
+ exec_args = task_executor.get("a", ())
793
+ exec_kwargs = task_executor.get("k", {})
794
+
795
+ result = exec_func(req['buffer'], *exec_args, **exec_kwargs)
783
796
  serialized_result = serialize(result, buffer_threshold=1000000)
784
797
  except Exception as e:
785
798
  logger.info('Caught an exception: {}'.format(e))
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.29
3
+ Version: 2025.10.6
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.09.29.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.06.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -8,7 +8,7 @@ parsl/multiprocessing.py,sha256=xqieTLko3DrHykCqqSHQszMwd8ORYllrgz6Qc_PsHCE,2112
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=smVYTusMoYUTD5N9OxTW5bh6o2iioh0NnfjrBAj8zYk,14452
11
- parsl/version.py,sha256=mjuTAq4pki_czBLWMzbgU5oYb9g5K_nnBiiBEpTePVE,131
11
+ parsl/version.py,sha256=f99TcEFVCtxnPE3Zu7czlSIUkdUi5SaPzVKQ0u864mA,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=CPhl-hYHLbH_zoE2rhRhcz2B4JWmm5pICWLUEkALPgQ,62860
58
+ parsl/dataflow/dflow.py,sha256=shxgZ5ulMYPnvyKx4nOrdhCZYLX3JgXPo1OC3168OZw,63087
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=AyO1khMwlbuGJQQk-l_wJRj0QeOHTOnmlvzXgQdNNQk,11977
@@ -75,7 +75,7 @@ parsl/executors/flux/executor.py,sha256=UhW8R_QVYIuafrX4xOIokzl1z7p4KjFBUzser3bA
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=Q8KpXeN9Eiv3NIJHC5zsGEqW4UO0hpLHTnPVFMUIiq4,40284
78
+ parsl/executors/high_throughput/executor.py,sha256=xtII7lb1skv2sUHmt9K6k4bE2LRvGmku-4h6cUTUM8k,42373
79
79
  parsl/executors/high_throughput/interchange.py,sha256=ODXsNNTkaEtwCGwqa5aclXyLw7x_dEtO9mANsOUTeNE,26158
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
@@ -84,7 +84,7 @@ parsl/executors/high_throughput/mpi_executor.py,sha256=Tumz8VD7ujxCFjuEsJq47Ez49
84
84
  parsl/executors/high_throughput/mpi_prefix_composer.py,sha256=DmpKugANNa1bdYlqQBLHkrFc15fJpefPPhW9hkAlh1s,4308
85
85
  parsl/executors/high_throughput/mpi_resource_management.py,sha256=KEG_yulFxEl61hZapdBsf3AejetivIBmXMkq1IkGcH0,7799
86
86
  parsl/executors/high_throughput/probe.py,sha256=QlBFwSSxMmtH-Aa2JEvCzQLddsbWZluMUxq5ypLR51E,3831
87
- parsl/executors/high_throughput/process_worker_pool.py,sha256=hmIiqz7tV2J35UkQjYrmqAkpZiZlfCrXxuDqv2rfSaM,40863
87
+ parsl/executors/high_throughput/process_worker_pool.py,sha256=NGYBWCssX83JH_tdtSPoFgazcxy7esi36yDyOO622WY,41375
88
88
  parsl/executors/high_throughput/zmq_pipes.py,sha256=Lr3A9Y5uyyf4VdD4L0Yontg-mNlO566k9-Ag7tXKp18,7330
89
89
  parsl/executors/radical/__init__.py,sha256=CKbtV2numw5QvgIBq1htMUrt9TqDCIC2zifyf2svTNU,186
90
90
  parsl/executors/radical/executor.py,sha256=eb7zgakpFBvGVlQ2NgxQlfjaql_mQQrYqqJJqbFxEno,22643
@@ -230,7 +230,6 @@ parsl/tests/configs/local_threads_checkpoint_task_exit.py,sha256=zHKN68T-xhAVQwQ
230
230
  parsl/tests/configs/local_threads_ftp_in_task.py,sha256=c9odRbxgj1bM_ttpkWTh2Ch_MV7f5cmn-68BOjLeJ70,444
231
231
  parsl/tests/configs/local_threads_globus.py,sha256=NhY27cD4vcqLh762Ye0BINZnt63EmTyHXg7FQMffOBw,1097
232
232
  parsl/tests/configs/local_threads_http_in_task.py,sha256=csDY-C50tXKO2ntbbPBvppCRlXBcB7UCQOHN_FyfFYc,447
233
- parsl/tests/configs/local_threads_no_cache.py,sha256=2LM8rYhl62LIFUMjAs2_VI_R25YW5AI3RfVK_e5bdN8,236
234
233
  parsl/tests/configs/midway.py,sha256=ZLdAUDR5paPA8gheRNLI0q9Vj5HcnCYuIttu-C-TlJs,1335
235
234
  parsl/tests/configs/nscc_singapore.py,sha256=ECENZcBuCjkY6OWZstEMhfMrmjRmjCc7ELdfGEp7ly4,1481
236
235
  parsl/tests/configs/osg_htex.py,sha256=x-C_r7Kpwvqroc4Ay1Yaya9K6_j7IU1ywqPegBU7HKI,1371
@@ -283,7 +282,7 @@ parsl/tests/test_checkpointing/test_periodic.py,sha256=92mHbznqkA1R3RDU7q_am1QH5
283
282
  parsl/tests/test_checkpointing/test_python_checkpoint_1.py,sha256=bi7c6fy6P7jmrMQkQP5me-LTfwVwJGq1O9BjnmdDIKc,715
284
283
  parsl/tests/test_checkpointing/test_python_checkpoint_2.py,sha256=Q_cXeAVz_dJuDDeiemUIGd-wmb7aCY3ggpqYjRRhHRc,1089
285
284
  parsl/tests/test_checkpointing/test_regression_232.py,sha256=AsI6AJ0DcFaefAbEY9qWa41ER0VX-4yLuIdlgvBw360,2637
286
- parsl/tests/test_checkpointing/test_regression_233.py,sha256=jii7BKuygK6KMIGtg4IeBjix7Z28cYhv57rE9ixoXMU,1774
285
+ parsl/tests/test_checkpointing/test_regression_233.py,sha256=i3x55DzMnuEOSojsF3wUCnAqlevPddL_7jV453MnqYU,1748
287
286
  parsl/tests/test_checkpointing/test_regression_239.py,sha256=xycW1_IwVC55L25oMES_OzJU58TN5BoMvRUZ_xB69jU,2441
288
287
  parsl/tests/test_checkpointing/test_task_exit.py,sha256=KLR2BFm3jyh4i1UMC1jrohTIVPHVXmDS4DWYsjkJV5k,1705
289
288
  parsl/tests/test_docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -312,7 +311,7 @@ parsl/tests/test_htex/test_cpu_affinity_explicit.py,sha256=DVHrRCskDbJIrfB5YSi3Z
312
311
  parsl/tests/test_htex/test_disconnected_blocks.py,sha256=3V1Ol9gMS6knjLTgIjB5GrunRSp4ANsJ_2vAvpyMR6c,1858
313
312
  parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py,sha256=eOdipRpKMOkWAXB3UtY1UjqTiwfNs_csNLve8vllG_M,2040
314
313
  parsl/tests/test_htex/test_drain.py,sha256=gYA7qzbv5ozox3clVdW0rlxAzwa_f_P0kqsAez3tIfk,2370
315
- parsl/tests/test_htex/test_htex.py,sha256=J1uEGezic8ziPPZsQwfK9iNiTJ53NqXMhIg9CUunjZw,4901
314
+ parsl/tests/test_htex/test_htex.py,sha256=PQ5F9xh4fG46lezRvnp7FfaW-4zoyTVIjY3ShCammDY,5897
316
315
  parsl/tests/test_htex/test_interchange_exit_bad_registration.py,sha256=n6M-GSI4lPDPlkl6QLDxQnT2ZHIf6cu0C1EMIBGNNbs,4532
317
316
  parsl/tests/test_htex/test_manager_failure.py,sha256=N-obuSZ8f7XA_XcddoN2LWKSVtpKUZvTHb7BFelS3iQ,1143
318
317
  parsl/tests/test_htex/test_manager_selector_by_block.py,sha256=VQqSE6MDhGpDSjShGUTbj7l9Ahuj2tC9qD--o4puF44,1310
@@ -364,14 +363,14 @@ parsl/tests/test_python_apps/test_fail.py,sha256=gMuZwxZNaUCaonlUX-7SOBvXg8kidkB
364
363
  parsl/tests/test_python_apps/test_fibonacci_iterative.py,sha256=ly2s5HuB9R53Z2FM_zy0WWdOk01iVhgcwSpQyK6ErIY,573
365
364
  parsl/tests/test_python_apps/test_fibonacci_recursive.py,sha256=q7LMFcu_pJSNPdz8iY0UiRoIweEWIBGwMjQffHWAuDc,592
366
365
  parsl/tests/test_python_apps/test_futures.py,sha256=EWnzmPn5sVCgeMxc0Uz2ieaaVYr98tFZ7g8YJFqYuC8,2355
367
- parsl/tests/test_python_apps/test_garbage_collect.py,sha256=RPntrLuzPkeNbhS7mmqEnHbyOcuV1YVppgZ8BaX-h84,1076
366
+ parsl/tests/test_python_apps/test_garbage_collect.py,sha256=jBKSvHr5SvuIRPEtUf2ED-oXntW4Nkri5lyxXVd2xU4,861
368
367
  parsl/tests/test_python_apps/test_import_fail.py,sha256=Vd8IMa_UsbHYkr3IGnS-rgGb6zKxB1tOTqMZY5lc_xY,691
369
368
  parsl/tests/test_python_apps/test_inputs_default.py,sha256=J2GR1NgdvEucNSJkfO6GC5OoMiuvSzO0tASCowT8HM0,436
370
369
  parsl/tests/test_python_apps/test_join.py,sha256=OWd6_A0Cf-1Xpjr0OT3HaJ1IMYcJ0LFL1VnmL0cZkL8,2988
371
370
  parsl/tests/test_python_apps/test_lifted.py,sha256=Na6qC_dZSeYJcZdkGn-dCjgYkQV267HmGFfaqFcRVcQ,3408
372
371
  parsl/tests/test_python_apps/test_mapred.py,sha256=C7nTl0NsP_2TCtcmZXWFMpvAG4pwGswrIJKr-5sRUNY,786
373
372
  parsl/tests/test_python_apps/test_memoize_1.py,sha256=E_VQAaykFKT_G7yRUWOhXxfOICj07qLq2R7onZ4oY9g,449
374
- parsl/tests/test_python_apps/test_memoize_2.py,sha256=uG9zG9j3ap1FqeJ8aB0Gj_dX191pN3dxWXeQ-asxPgU,553
373
+ parsl/tests/test_python_apps/test_memoize_2.py,sha256=tTJOZRSC6HwLctvPm_x6acNA5QGrpH-fJnpYLGbjYOc,705
375
374
  parsl/tests/test_python_apps/test_memoize_4.py,sha256=CdK_vHW5s-phi5KPqcAQm_BRh8xek91GVGeQRjfJ4Bk,569
376
375
  parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py,sha256=5v25zdU6koXexRTkccj_3sSSdXqHdsU8ZdNrnZ3ONZU,1436
377
376
  parsl/tests/test_python_apps/test_memoize_exception.py,sha256=GdvB5XFnW5pbkFMETzxWC3nIKo13Pm0benq9u2UnM1E,1232
@@ -451,13 +450,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
451
450
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
452
451
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
453
452
  parsl/usage_tracking/usage.py,sha256=hbMo5BYgIWqMcFWqN-HYP1TbwNrTonpv-usfwnCFJKY,9212
454
- parsl-2025.9.29.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
455
- parsl-2025.9.29.data/scripts/interchange.py,sha256=Kn0yJnpcRsc37gfhD6mGkoX9wD7vP_QgWst7qwUjj5o,26145
456
- parsl-2025.9.29.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
457
- parsl-2025.9.29.data/scripts/process_worker_pool.py,sha256=RXV_w5O2XSb_ySJOXacGQlrR6-HdPuNkGMcaiR93i4M,40849
458
- parsl-2025.9.29.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
459
- parsl-2025.9.29.dist-info/METADATA,sha256=pWkSrPV2137jfgCpUVJYaoh-o0ZOk0O0SADK2rk9ubA,4006
460
- parsl-2025.9.29.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
461
- parsl-2025.9.29.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
462
- parsl-2025.9.29.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
463
- parsl-2025.9.29.dist-info/RECORD,,
453
+ parsl-2025.10.6.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
454
+ parsl-2025.10.6.data/scripts/interchange.py,sha256=Kn0yJnpcRsc37gfhD6mGkoX9wD7vP_QgWst7qwUjj5o,26145
455
+ parsl-2025.10.6.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
456
+ parsl-2025.10.6.data/scripts/process_worker_pool.py,sha256=tD01F96f3RCGz9kUe8fMq8g8DqeJe425n6V5tQ5fDPE,41361
457
+ parsl-2025.10.6.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
458
+ parsl-2025.10.6.dist-info/METADATA,sha256=4MOap6ipA5ijRtv_KdjigUGPoPSc18UrwWkxf0HA29M,4006
459
+ parsl-2025.10.6.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
460
+ parsl-2025.10.6.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
461
+ parsl-2025.10.6.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
462
+ parsl-2025.10.6.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.threads import ThreadPoolExecutor
3
-
4
-
5
- def fresh_config():
6
- return Config(
7
- executors=[
8
- ThreadPoolExecutor(max_threads=4),
9
- ],
10
- app_cache=False
11
- )