parsl 2025.10.6__py3-none-any.whl → 2025.10.13__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/benchmark/perf.py CHANGED
@@ -6,6 +6,7 @@ from typing import Any, Dict
6
6
 
7
7
  import parsl
8
8
  from parsl.dataflow.dflow import DataFlowKernel
9
+ from parsl.errors import InternalConsistencyError
9
10
 
10
11
  min_iterations = 2
11
12
 
@@ -40,19 +41,18 @@ def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
40
41
  return 7
41
42
 
42
43
 
43
- def performance(*, resources: dict, target_t: float, args_extra_size: int) -> None:
44
+ def performance(*, resources: dict, target_t: float, args_extra_size: int, iterate_mode: str) -> None:
44
45
  n = 10
45
46
 
46
47
  delta_t: float
47
- delta_t = 0
48
-
49
- threshold_t = int(0.75 * target_t)
50
48
 
51
49
  iteration = 1
52
50
 
53
51
  args_extra_payload = "x" * args_extra_size
54
52
 
55
- while delta_t < threshold_t or iteration <= min_iterations:
53
+ iterate = True
54
+
55
+ while iterate:
56
56
  print(f"==== Iteration {iteration} ====")
57
57
  print(f"Will run {n} tasks to target {target_t} seconds runtime")
58
58
  start_t = time.time()
@@ -78,10 +78,20 @@ def performance(*, resources: dict, target_t: float, args_extra_size: int) -> No
78
78
  print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
79
79
  print(f"Tasks per second: {rate:.3f}")
80
80
 
81
- n = max(1, int(target_t * rate))
82
-
83
81
  iteration += 1
84
82
 
83
+ # decide upon next iteration
84
+
85
+ match iterate_mode:
86
+ case "estimate":
87
+ n = max(1, int(target_t * rate))
88
+ iterate = delta_t < (0.75 * target_t) or iteration <= min_iterations
89
+ case "exponential":
90
+ n = int(n * 2)
91
+ iterate = delta_t < target_t or iteration <= min_iterations
92
+ case _:
93
+ raise InternalConsistencyError(f"Bad iterate mode {iterate_mode} - should have been validated at arg parse time")
94
+
85
95
 
86
96
  def cli_run() -> None:
87
97
  parser = argparse.ArgumentParser(
@@ -96,6 +106,12 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
96
106
  parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
97
107
  parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
98
108
  parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
109
+ parser.add_argument("--iterate",
110
+ metavar="MODE",
111
+ help="Iteration mode: estimate, exponential",
112
+ type=str,
113
+ default="estimate",
114
+ choices=("estimate", "exponential"))
99
115
 
100
116
  args = parser.parse_args()
101
117
 
@@ -105,7 +121,7 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
105
121
  resources = {}
106
122
 
107
123
  with load_dfk_from_config(args.config):
108
- performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
124
+ performance(resources=resources, target_t=args.time, args_extra_size=args.argsize, iterate_mode=args.iterate)
109
125
  print("Tests complete - leaving DFK block")
110
126
  print("The end")
111
127
 
parsl/executors/base.py CHANGED
@@ -80,11 +80,11 @@ class ParslExecutor(metaclass=ABCMeta):
80
80
  self.shutdown()
81
81
  return False
82
82
 
83
- @abstractmethod
84
83
  def start(self) -> None:
85
84
  """Start the executor.
86
85
 
87
- Any spin-up operations (for example: starting thread pools) should be performed here.
86
+ By default, this does nothing, but this method should be overridden to
87
+ perform any spin-up operations (for example: starting thread pools).
88
88
  """
89
89
  pass
90
90
 
@@ -76,10 +76,6 @@ class GlobusComputeExecutor(ParslExecutor, RepresentationMixin):
76
76
  self.storage_access = storage_access
77
77
  self.working_dir = working_dir
78
78
 
79
- def start(self) -> None:
80
- """ Start the Globus Compute Executor """
81
- super().start()
82
-
83
79
  def submit(self, func: Callable, resource_specification: Dict[str, Any], *args: Any, **kwargs: Any) -> Future:
84
80
  """ Submit func to globus-compute
85
81
 
@@ -379,7 +379,7 @@ class Manager:
379
379
  last_interchange_contact = time.time()
380
380
 
381
381
  if tasks == HEARTBEAT_CODE:
382
- logger.debug("Got heartbeat from interchange")
382
+ logger.debug("Got heartbeat response from interchange")
383
383
  elif tasks == DRAINED_CODE:
384
384
  logger.info("Got fully drained message from interchange - setting kill flag")
385
385
  self._stop_event.set()
@@ -10,11 +10,12 @@ from parsl.monitoring.radios.base import (
10
10
  RadioConfig,
11
11
  )
12
12
  from parsl.monitoring.radios.filesystem_router import FilesystemRadioReceiver
13
+ from parsl.utils import RepresentationMixin
13
14
 
14
15
  logger = logging.getLogger(__name__)
15
16
 
16
17
 
17
- class FilesystemRadio(RadioConfig):
18
+ class FilesystemRadio(RadioConfig, RepresentationMixin):
18
19
  """A MonitoringRadioSender that sends messages over a shared filesystem.
19
20
 
20
21
  The messsage directory structure is based on maildir,
@@ -7,11 +7,12 @@ from parsl.monitoring.radios.base import (
7
7
  MonitoringRadioSender,
8
8
  RadioConfig,
9
9
  )
10
+ from parsl.utils import RepresentationMixin
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
13
14
 
14
- class HTEXRadio(RadioConfig):
15
+ class HTEXRadio(RadioConfig, RepresentationMixin):
15
16
  def create_sender(self) -> MonitoringRadioSender:
16
17
  return HTEXRadioSender()
17
18
 
@@ -5,9 +5,10 @@ from parsl.monitoring.radios.base import (
5
5
  MonitoringRadioSender,
6
6
  RadioConfig,
7
7
  )
8
+ from parsl.utils import RepresentationMixin
8
9
 
9
10
 
10
- class MultiprocessingQueueRadioSender(MonitoringRadioSender):
11
+ class MultiprocessingQueueRadioSender(MonitoringRadioSender, RepresentationMixin):
11
12
  """A monitoring radio which connects over a multiprocessing Queue.
12
13
  This radio is intended to be used on the submit side, where components
13
14
  in the submit process, or processes launched by multiprocessing, will have
@@ -13,11 +13,12 @@ from parsl.monitoring.radios.base import (
13
13
  RadioConfig,
14
14
  )
15
15
  from parsl.monitoring.radios.udp_router import start_udp_receiver
16
+ from parsl.utils import RepresentationMixin
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
19
20
 
20
- class UDPRadio(RadioConfig):
21
+ class UDPRadio(RadioConfig, RepresentationMixin):
21
22
  def __init__(self, *, port: Optional[int] = None, atexit_timeout: int = 3, address: str, debug: bool = False, hmac_digest: str = 'sha512'):
22
23
  self.port = port
23
24
  self.atexit_timeout = atexit_timeout
parsl/providers/base.py CHANGED
@@ -33,7 +33,28 @@ class ExecutionProvider(metaclass=ABCMeta):
33
33
  [cancel] <--------|----+
34
34
  |
35
35
  +-------------------
36
- """
36
+
37
+ In addition to the listed methods, an ExecutionProvider instance must always
38
+ have these attributes, which both default to `None`:
39
+
40
+ mem_per_node: Real memory to provision per node in GB.
41
+
42
+ Providers which set this attribute should ask for mem_per_node of memory
43
+ when provisioning resources, and set the corresponding environment
44
+ variable PARSL_MEMORY_GB before executing submitted commands.
45
+
46
+ If this attribute is set, executors may use it to calculate how many tasks can
47
+ run concurrently per node.
48
+
49
+ cores_per_node: Number of cores to provision per node.
50
+
51
+ Providers which set this attribute should ask for cores_per_node cores
52
+ when provisioning resources, and set the corresponding environment
53
+ variable PARSL_CORES before executing submitted commands.
54
+
55
+ If this attribute is set, executors may use it to calculate how many tasks can
56
+ run concurrently per node.
57
+ """
37
58
 
38
59
  @abstractmethod
39
60
  def __init__(self) -> None:
@@ -44,8 +65,8 @@ class ExecutionProvider(metaclass=ABCMeta):
44
65
  self.script_dir: Optional[str]
45
66
  self.parallelism: float
46
67
  self.resources: Dict[object, Any]
47
- self._cores_per_node: Optional[int] = None
48
- self._mem_per_node: Optional[float] = None
68
+ self.cores_per_node: Optional[int] = None
69
+ self.mem_per_node: Optional[float] = None
49
70
  pass
50
71
 
51
72
  @abstractmethod
@@ -111,40 +132,6 @@ class ExecutionProvider(metaclass=ABCMeta):
111
132
  ''' Provides the label for this provider '''
112
133
  pass
113
134
 
114
- @property
115
- def mem_per_node(self) -> Optional[float]:
116
- """Real memory to provision per node in GB.
117
-
118
- Providers which set this property should ask for mem_per_node of memory
119
- when provisioning resources, and set the corresponding environment
120
- variable PARSL_MEMORY_GB before executing submitted commands.
121
-
122
- If this property is set, executors may use it to calculate how many tasks can
123
- run concurrently per node.
124
- """
125
- return self._mem_per_node
126
-
127
- @mem_per_node.setter
128
- def mem_per_node(self, value: float) -> None:
129
- self._mem_per_node = value
130
-
131
- @property
132
- def cores_per_node(self) -> Optional[int]:
133
- """Number of cores to provision per node.
134
-
135
- Providers which set this property should ask for cores_per_node cores
136
- when provisioning resources, and set the corresponding environment
137
- variable PARSL_CORES before executing submitted commands.
138
-
139
- If this property is set, executors may use it to calculate how many tasks can
140
- run concurrently per node.
141
- """
142
- return self._cores_per_node
143
-
144
- @cores_per_node.setter
145
- def cores_per_node(self, value: int) -> None:
146
- self._cores_per_node = value
147
-
148
135
  @property
149
136
  @abstractmethod
150
137
  def status_polling_interval(self) -> int:
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.10.06'
6
+ VERSION = '2025.10.13'
@@ -379,7 +379,7 @@ class Manager:
379
379
  last_interchange_contact = time.time()
380
380
 
381
381
  if tasks == HEARTBEAT_CODE:
382
- logger.debug("Got heartbeat from interchange")
382
+ logger.debug("Got heartbeat response from interchange")
383
383
  elif tasks == DRAINED_CODE:
384
384
  logger.info("Got fully drained message from interchange - setting kill flag")
385
385
  self._stop_event.set()
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.10.6
3
+ Version: 2025.10.13
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.10.06.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.13.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=f99TcEFVCtxnPE3Zu7czlSIUkdUi5SaPzVKQ0u864mA,131
11
+ parsl/version.py,sha256=rx6RT17unUOKqi7eD7qVlatEYlVhzqpa0D-qZ3mnuMs,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
@@ -16,7 +16,7 @@ parsl/app/errors.py,sha256=SQQ1fNp8834DZnoRnlsoZn1WMAFM3fnh2CNHRPmFcKc,3854
16
16
  parsl/app/futures.py,sha256=2tMUeKIuDzwuhLIWlsEiZuDrhkxxsUed4QUbQuQg20Y,2826
17
17
  parsl/app/python.py,sha256=0hrz2BppVOwwNfh5hnoP70Yv56gSRkIoT-fP9XNb4v4,2331
18
18
  parsl/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- parsl/benchmark/perf.py,sha256=DRTNSA_-Qq01GfMl6MEWtwENEu1aReHC23SX6f0HuXk,3615
19
+ parsl/benchmark/perf.py,sha256=5cSadhxr8qZnYIRLYdL2AM-5VFrRYn36FqHsaPrR9NA,4393
20
20
  parsl/concurrent/__init__.py,sha256=TvIVceJYaJAsxedNBF3Vdo9lEQNHH_j3uxJv0zUjP7w,3288
21
21
  parsl/configs/ASPIRE1.py,sha256=nQm6BvCPE07YXEsC94wMrHeVAyYcyfvPgWyHIysjAoA,1690
22
22
  parsl/configs/Azure.py,sha256=CJms3xWmdb-S3CksbHrPF2TfMxJC5I0faqUKCOzVg0k,1268
@@ -63,10 +63,10 @@ parsl/dataflow/rundirs.py,sha256=JZdzybVGubY35jL2YiKcDo65ZmRl1WyOApc8ajYxztc,108
63
63
  parsl/dataflow/states.py,sha256=hV6mfv-y4A6xrujeQglcomnfEs7y3Xm2g6JFwC6dvgQ,2612
64
64
  parsl/dataflow/taskrecord.py,sha256=qIW7T6hn9dYTuNPdUura3HQwwUpUJACwPP5REm5COf4,3042
65
65
  parsl/executors/__init__.py,sha256=PEuXYrnVqwlaz_nt82s9D_YNaVsX7ET29DeIZRUR8hw,577
66
- parsl/executors/base.py,sha256=Qlc7Qa-jbfGpQcGB29JUFXCdhcSN63bjGubEcbDk270,4948
66
+ parsl/executors/base.py,sha256=n-_tFtigMguc_alT8vSf1zKl2EuoGC1lmUewTv3dgsc,4990
67
67
  parsl/executors/errors.py,sha256=ZxL3nK5samPos8Xixo_jpRtPIiRJfZ5D397_qaXj2g0,2515
68
68
  parsl/executors/execute_task.py,sha256=Kx6V4Qe_Y2mtiKiUYAlGFseceKgzBdoXfuVsOouk2U4,892
69
- parsl/executors/globus_compute.py,sha256=p59iBrv2BvYUAZ3YZSpOrm_Wpai592ueiJm3zFS7gvY,5304
69
+ parsl/executors/globus_compute.py,sha256=MiycdMLIzi7Ev6mxNB9_9ZkCcWEypOW2CfSHYjTyfRY,5200
70
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
@@ -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=NGYBWCssX83JH_tdtSPoFgazcxy7esi36yDyOO622WY,41375
87
+ parsl/executors/high_throughput/process_worker_pool.py,sha256=uic5cg85OCoL6gwAe0u-COSY3lDFayq55RP6wnIma_4,41384
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
@@ -126,11 +126,11 @@ parsl/monitoring/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
126
126
  parsl/monitoring/queries/pandas.py,sha256=0Z2r0rjTKCemf0eaDkF1irvVHn5g7KC5SYETvQPRxwU,2232
127
127
  parsl/monitoring/radios/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  parsl/monitoring/radios/base.py,sha256=LnTWz4Czew-Nh6TwHMGXLHO8bH5zlSoMO-0rkqyezO0,2622
129
- parsl/monitoring/radios/filesystem.py,sha256=R6ueEVsmmx1ltpBdZUILYLAueiSe8KwTJLqjseaySNo,2240
129
+ parsl/monitoring/radios/filesystem.py,sha256=YQDS0GQTVxkc2ryZRkrfxZO91LWUcEHOdfUnVB33pLo,2305
130
130
  parsl/monitoring/radios/filesystem_router.py,sha256=_Sf1M00oUn-gBvq-P7Ua1Ws5_SbPFiTQvYAJ1Q6Mbro,2992
131
- parsl/monitoring/radios/htex.py,sha256=R3Ce7fxiVtQFxn0EgJ-9wKiMJ_xCJml02b0rXnxORXQ,1870
132
- parsl/monitoring/radios/multiprocessing.py,sha256=4ua-6kmdQ6XiXzPBM8DjkFXy1LP5x0sERxeaR-WyKHc,1308
133
- parsl/monitoring/radios/udp.py,sha256=vrcl-yHWQ9YpOw6cmAQgczlNAUr_Um1y-GLye-9j-7s,3499
131
+ parsl/monitoring/radios/htex.py,sha256=PHJhzK_Zf3ti3oOPnOWk8gpvvsLM_LlLrIXr3tDJBjA,1935
132
+ parsl/monitoring/radios/multiprocessing.py,sha256=C-VNSHJxYdtNK44gIT6ydzal5ytSFDGkoEFyZOyVy_c,1373
133
+ parsl/monitoring/radios/udp.py,sha256=S0IjteFh8Fch8GJLUMA9SpedkdhWGri27aqv3BpkpP0,3564
134
134
  parsl/monitoring/radios/udp_router.py,sha256=l4VTEIT48HWDXwjNzWl-Yp-7iY7EiAS-lwkFxm8TK-c,8987
135
135
  parsl/monitoring/radios/zmq.py,sha256=fhoHp9ylhf-D3eTJb2aSHRsuic8-FJ_oRNGnniGkCAI,592
136
136
  parsl/monitoring/radios/zmq_router.py,sha256=upX6gLVSRHZYxnknmpRjAb1kUnF2wHuT_uHTc2l_LLw,7826
@@ -156,7 +156,7 @@ parsl/monitoring/visualization/templates/task.html,sha256=omDwp7zFXHVtuGsUCXcB7x
156
156
  parsl/monitoring/visualization/templates/workflow.html,sha256=QCSHAPHK_2C3gNcZ3NmChLFG6xuchZEjT_iLQ3wwXmk,1871
157
157
  parsl/monitoring/visualization/templates/workflows_summary.html,sha256=7brKKNsxcT4z-l10BKJlgTxQtGL033ZS5jEDdSmsPEE,891
158
158
  parsl/providers/__init__.py,sha256=aUvIDlvYUXFa66YhqqUFyTg6dd4Si3oSmsZUPNw0oOE,991
159
- parsl/providers/base.py,sha256=-yAfK8zNc2LCX8GFyRJ4sN5ekL_gqftJ3QHtLSWyrTw,5264
159
+ parsl/providers/base.py,sha256=V3JvfzyJ7C2-QXBwm4_xYRP9OLdlOQddEZTt_2dQNhs,5102
160
160
  parsl/providers/cluster_provider.py,sha256=w2DFkzrIh-LuXVaWVsYjRHmZoO_5J9g2wjB91offJMs,4370
161
161
  parsl/providers/errors.py,sha256=_CbCmpguzcA81SC5dPLkDZs1AShzacGKttNhuzNBeiQ,2270
162
162
  parsl/providers/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -450,13 +450,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
450
450
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
451
451
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
452
452
  parsl/usage_tracking/usage.py,sha256=hbMo5BYgIWqMcFWqN-HYP1TbwNrTonpv-usfwnCFJKY,9212
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,,
453
+ parsl-2025.10.13.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
454
+ parsl-2025.10.13.data/scripts/interchange.py,sha256=Kn0yJnpcRsc37gfhD6mGkoX9wD7vP_QgWst7qwUjj5o,26145
455
+ parsl-2025.10.13.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
456
+ parsl-2025.10.13.data/scripts/process_worker_pool.py,sha256=euc3xPPw1zFdXVjgbSvyyIcvjcEZGXZTi0aSj23Vp-g,41370
457
+ parsl-2025.10.13.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
458
+ parsl-2025.10.13.dist-info/METADATA,sha256=VL1Yq8GWBXD6N7tstvWAcC5Tfs1rCOX8ldffVN6HtCo,4007
459
+ parsl-2025.10.13.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
460
+ parsl-2025.10.13.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
461
+ parsl-2025.10.13.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
462
+ parsl-2025.10.13.dist-info/RECORD,,