parsl 2024.3.4__py3-none-any.whl → 2024.3.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.
parsl/addresses.py CHANGED
@@ -81,7 +81,7 @@ def address_by_hostname() -> str:
81
81
  def address_by_interface(ifname: str) -> str:
82
82
  """Returns the IP address of the given interface name, e.g. 'eth0'
83
83
 
84
- This is taken from a Stack Overflow answer: https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python#24196955
84
+ This is from a Stack Overflow answer: https://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python#24196955
85
85
 
86
86
  Parameters
87
87
  ----------
parsl/dataflow/dflow.py CHANGED
@@ -95,7 +95,7 @@ class DataFlowKernel:
95
95
  self.checkpoint_lock = threading.Lock()
96
96
 
97
97
  self.usage_tracker = UsageTracker(self)
98
- self.usage_tracker.send_message()
98
+ self.usage_tracker.send_start_message()
99
99
 
100
100
  self.task_state_counts_lock = threading.Lock()
101
101
  self.task_state_counts = {state: 0 for state in States}
@@ -722,7 +722,10 @@ class DataFlowKernel:
722
722
  self._send_task_log_info(task_record)
723
723
 
724
724
  if hasattr(exec_fu, "parsl_executor_task_id"):
725
- logger.info(f"Parsl task {task_id} try {try_id} launched on executor {executor.label} with executor id {exec_fu.parsl_executor_task_id}")
725
+ logger.info(
726
+ f"Parsl task {task_id} try {try_id} launched on executor {executor.label} "
727
+ f"with executor id {exec_fu.parsl_executor_task_id}")
728
+
726
729
  else:
727
730
  logger.info(f"Parsl task {task_id} try {try_id} launched on executor {executor.label}")
728
731
 
@@ -730,7 +733,8 @@ class DataFlowKernel:
730
733
 
731
734
  return exec_fu
732
735
 
733
- def _add_input_deps(self, executor: str, args: Sequence[Any], kwargs: Dict[str, Any], func: Callable) -> Tuple[Sequence[Any], Dict[str, Any], Callable]:
736
+ def _add_input_deps(self, executor: str, args: Sequence[Any], kwargs: Dict[str, Any], func: Callable) -> Tuple[Sequence[Any], Dict[str, Any],
737
+ Callable]:
734
738
  """Look for inputs of the app that are files. Give the data manager
735
739
  the opportunity to replace a file with a data future for that file,
736
740
  for example wrapping the result of a staging action.
@@ -1142,8 +1146,9 @@ class DataFlowKernel:
1142
1146
 
1143
1147
  def atexit_cleanup(self) -> None:
1144
1148
  if not self.cleanup_called:
1145
- logger.info("DFK cleanup because python process is exiting")
1146
- self.cleanup()
1149
+ logger.warning("Python is exiting with a DFK still running. "
1150
+ "You should call parsl.dfk().cleanup() before "
1151
+ "exiting to release any resources")
1147
1152
  else:
1148
1153
  logger.info("python process is exiting, but DFK has already been cleaned up")
1149
1154
 
@@ -1200,7 +1205,7 @@ class DataFlowKernel:
1200
1205
  self._checkpoint_timer.close()
1201
1206
 
1202
1207
  # Send final stats
1203
- self.usage_tracker.send_message()
1208
+ self.usage_tracker.send_end_message()
1204
1209
  self.usage_tracker.close()
1205
1210
 
1206
1211
  logger.info("Closing job status poller")
@@ -70,7 +70,9 @@ class TaskRecord(TypedDict, total=False):
70
70
  # these three could be more strongly typed perhaps but I'm not thinking about that now
71
71
  func: Callable
72
72
  fn_hash: str
73
- args: Sequence[Any] # in some places we uses a Tuple[Any, ...] and in some places a List[Any]. This is an attempt to correctly type both of those.
73
+ args: Sequence[Any]
74
+ # in some places we uses a Tuple[Any, ...] and in some places a List[Any].
75
+ # This is an attempt to correctly type both of those.
74
76
  kwargs: Dict[str, Any]
75
77
 
76
78
  time_invoked: Optional[datetime.datetime]
@@ -6,6 +6,7 @@ import threading
6
6
  import queue
7
7
  import datetime
8
8
  import pickle
9
+ from dataclasses import dataclass
9
10
  from multiprocessing import Process, Queue
10
11
  from typing import Dict, Sequence
11
12
  from typing import List, Optional, Tuple, Union, Callable
@@ -327,7 +328,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
327
328
  def _warn_deprecated(self, old: str, new: str):
328
329
  warnings.warn(
329
330
  f"{old} is deprecated and will be removed in a future release. "
330
- "Please use {new} instead.",
331
+ f"Please use {new} instead.",
331
332
  DeprecationWarning,
332
333
  stacklevel=2
333
334
  )
@@ -628,8 +629,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
628
629
  """Submits work to the outgoing_q.
629
630
 
630
631
  The outgoing_q is an external process listens on this
631
- queue for new work. This method behaves like a
632
- submit call as described here `Python docs: <https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor>`_
632
+ queue for new work. This method behaves like a submit call as described here `Python docs: <https://docs.python.org/3/
633
+ library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor>`_
633
634
 
634
635
  Args:
635
636
  - func (callable) : Callable function
@@ -694,7 +695,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
694
695
  def workers_per_node(self) -> Union[int, float]:
695
696
  return self._workers_per_node
696
697
 
697
- def scale_in(self, blocks, max_idletime=None):
698
+ def scale_in(self, blocks: int, max_idletime: Optional[float] = None) -> List[str]:
698
699
  """Scale in the number of active blocks by specified amount.
699
700
 
700
701
  The scale in method here is very rude. It doesn't give the workers
@@ -721,25 +722,36 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
721
722
  List of block IDs scaled in
722
723
  """
723
724
  logger.debug(f"Scale in called, blocks={blocks}")
725
+
726
+ @dataclass
727
+ class BlockInfo:
728
+ tasks: int # sum of tasks in this block
729
+ idle: float # shortest idle time of any manager in this block
730
+
724
731
  managers = self.connected_managers()
725
- block_info = {} # block id -> list( tasks, idle duration )
732
+ block_info: Dict[str, BlockInfo] = {}
726
733
  for manager in managers:
727
734
  if not manager['active']:
728
735
  continue
729
736
  b_id = manager['block_id']
730
737
  if b_id not in block_info:
731
- block_info[b_id] = [0, float('inf')]
732
- block_info[b_id][0] += manager['tasks']
733
- block_info[b_id][1] = min(block_info[b_id][1], manager['idle_duration'])
738
+ block_info[b_id] = BlockInfo(tasks=0, idle=float('inf'))
739
+ block_info[b_id].tasks += manager['tasks']
740
+ block_info[b_id].idle = min(block_info[b_id].idle, manager['idle_duration'])
741
+
742
+ # The scaling policy is that longest idle blocks should be scaled down
743
+ # in preference to least idle (most recently used) blocks.
744
+ # Other policies could be implemented here.
745
+
746
+ sorted_blocks = sorted(block_info.items(), key=lambda item: (-item[1].idle, item[1].tasks))
734
747
 
735
- sorted_blocks = sorted(block_info.items(), key=lambda item: (item[1][1], item[1][0]))
736
748
  logger.debug(f"Scale in selecting from {len(sorted_blocks)} blocks")
737
749
  if max_idletime is None:
738
750
  block_ids_to_kill = [x[0] for x in sorted_blocks[:blocks]]
739
751
  else:
740
752
  block_ids_to_kill = []
741
753
  for x in sorted_blocks:
742
- if x[1][1] > max_idletime and x[1][0] == 0:
754
+ if x[1].idle > max_idletime and x[1].tasks == 0:
743
755
  block_ids_to_kill.append(x[0])
744
756
  if len(block_ids_to_kill) == blocks:
745
757
  break
@@ -392,7 +392,12 @@ class Interchange:
392
392
  logger.info("Processed {} tasks in {} seconds".format(self.count, delta))
393
393
  logger.warning("Exiting")
394
394
 
395
- def process_task_outgoing_incoming(self, interesting_managers: Set[bytes], hub_channel: Optional[zmq.Socket], kill_event: threading.Event) -> None:
395
+ def process_task_outgoing_incoming(
396
+ self,
397
+ interesting_managers: Set[bytes],
398
+ hub_channel: Optional[zmq.Socket],
399
+ kill_event: threading.Event
400
+ ) -> None:
396
401
  """Process one message from manager on the task_outgoing channel.
397
402
  Note that this message flow is in contradiction to the name of the
398
403
  channel - it is not an outgoing message and it is not a task.
@@ -621,7 +626,13 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
621
626
  None.
622
627
  """
623
628
  if format_string is None:
624
- format_string = "%(asctime)s.%(msecs)03d %(name)s:%(lineno)d %(processName)s(%(process)d) %(threadName)s %(funcName)s [%(levelname)s] %(message)s"
629
+ format_string = (
630
+
631
+ "%(asctime)s.%(msecs)03d %(name)s:%(lineno)d "
632
+ "%(processName)s(%(process)d) %(threadName)s "
633
+ "%(funcName)s [%(levelname)s] %(message)s"
634
+
635
+ )
625
636
 
626
637
  global logger
627
638
  logger = logging.getLogger(LOGGER_NAME)
@@ -413,7 +413,9 @@ class Manager:
413
413
  raise WorkerLost(worker_id, platform.node())
414
414
  except Exception:
415
415
  logger.info("Putting exception for executor task {} in the pending result queue".format(task['task_id']))
416
- result_package = {'type': 'result', 'task_id': task['task_id'], 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
416
+ result_package = {'type': 'result',
417
+ 'task_id': task['task_id'],
418
+ 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
417
419
  pkl_package = pickle.dumps(result_package)
418
420
  self.pending_result_queue.put(pkl_package)
419
421
  except KeyError:
@@ -867,7 +869,10 @@ if __name__ == "__main__":
867
869
  block_id=args.block_id,
868
870
  cores_per_worker=float(args.cores_per_worker),
869
871
  mem_per_worker=None if args.mem_per_worker == 'None' else float(args.mem_per_worker),
870
- max_workers_per_node=args.max_workers_per_node if args.max_workers_per_node == float('inf') else int(args.max_workers_per_node),
872
+ max_workers_per_node=(
873
+ args.max_workers_per_node if args.max_workers_per_node == float('inf')
874
+ else int(args.max_workers_per_node)
875
+ ),
871
876
  prefetch_capacity=int(args.prefetch_capacity),
872
877
  heartbeat_threshold=int(args.hb_threshold),
873
878
  heartbeat_period=int(args.hb_period),
@@ -228,7 +228,9 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
228
228
  # factory logs go with manager logs regardless
229
229
  self.factory_config.scratch_dir = self.manager_config.vine_log_dir
230
230
  logger.debug(f"Function data directory: {self._function_data_dir}, log directory: {log_dir}")
231
- logger.debug(f"TaskVine manager log directory: {self.manager_config.vine_log_dir}, factory log directory: {self.factory_config.scratch_dir}")
231
+ logger.debug(
232
+ f"TaskVine manager log directory: {self.manager_config.vine_log_dir}, "
233
+ f"factory log directory: {self.factory_config.scratch_dir}")
232
234
 
233
235
  def start(self):
234
236
  """Create submit process and collector thread to create, send, and
parsl/jobs/strategy.py CHANGED
@@ -245,7 +245,8 @@ class Strategy:
245
245
  exec_status.scale_in(active_blocks - min_blocks)
246
246
 
247
247
  else:
248
- logger.debug(f"Idle time {idle_duration}s is less than max_idletime {self.max_idletime}s for executor {label}; not scaling in")
248
+ logger.debug(
249
+ f"Idle time {idle_duration}s is less than max_idletime {self.max_idletime}s for executor {label}; not scaling in")
249
250
 
250
251
  # Case 2
251
252
  # More tasks than the available slots.
@@ -103,7 +103,13 @@ class Database:
103
103
  def rollback(self) -> None:
104
104
  self.session.rollback()
105
105
 
106
- def _generate_mappings(self, table: Table, columns: Optional[List[str]] = None, messages: List[MonitoringMessage] = []) -> List[Dict[str, Any]]:
106
+ def _generate_mappings(
107
+ self,
108
+ table: Table,
109
+ columns: Optional[List[str]] = None,
110
+ messages: List[MonitoringMessage] = [],
111
+ ) -> List[Dict[str, Any]]:
112
+
107
113
  mappings = []
108
114
  for msg in messages:
109
115
  m = {}
@@ -250,6 +256,12 @@ class Database:
250
256
  'psutil_process_disk_write', Float, nullable=True)
251
257
  psutil_process_status = Column(
252
258
  'psutil_process_status', Text, nullable=True)
259
+ psutil_cpu_num = Column(
260
+ 'psutil_cpu_num', Text, nullable=True)
261
+ psutil_process_num_ctx_switches_voluntary = Column(
262
+ 'psutil_process_num_ctx_switches_voluntary', Float, nullable=True)
263
+ psutil_process_num_ctx_switches_involuntary = Column(
264
+ 'psutil_process_num_ctx_switches_involuntary', Float, nullable=True)
253
265
  __table_args__ = (
254
266
  PrimaryKeyConstraint('try_id', 'task_id', 'run_id', 'timestamp'),
255
267
  )
@@ -518,7 +530,10 @@ class DatabaseManager:
518
530
  reprocessable_first_resource_messages.append(msg)
519
531
  else:
520
532
  if task_try_id in deferred_resource_messages:
521
- logger.error("Task {} already has a deferred resource message. Discarding previous message.".format(msg['task_id']))
533
+ logger.error(
534
+ "Task {} already has a deferred resource message. "
535
+ "Discarding previous message.".format(msg['task_id'])
536
+ )
522
537
  deferred_resource_messages[task_try_id] = msg
523
538
  elif msg['last_msg']:
524
539
  # This assumes that the primary key has been added
@@ -544,7 +559,10 @@ class DatabaseManager:
544
559
  if reprocessable_last_resource_messages:
545
560
  self._insert(table=STATUS, messages=reprocessable_last_resource_messages)
546
561
  except Exception:
547
- logger.exception("Exception in db loop: this might have been a malformed message, or some other error. monitoring data may have been lost")
562
+ logger.exception(
563
+ "Exception in db loop: this might have been a malformed message, "
564
+ "or some other error. monitoring data may have been lost"
565
+ )
548
566
  exception_happened = True
549
567
  if exception_happened:
550
568
  raise RuntimeError("An exception happened sometime during database processing and should have been logged in database_manager.log")
@@ -571,8 +589,10 @@ class DatabaseManager:
571
589
  self._dispatch_to_internal(x)
572
590
  elif queue_tag == 'resource':
573
591
  assert isinstance(x, tuple), "_migrate_logs_to_internal was expecting a tuple, got {}".format(x)
574
- assert x[0] == MessageType.RESOURCE_INFO, \
575
- "_migrate_logs_to_internal can only migrate RESOURCE_INFO message from resource queue, got tag {}, message {}".format(x[0], x)
592
+ assert x[0] == MessageType.RESOURCE_INFO, (
593
+ "_migrate_logs_to_internal can only migrate RESOURCE_INFO message from resource queue, "
594
+ "got tag {}, message {}".format(x[0], x)
595
+ )
576
596
  self._dispatch_to_internal(x)
577
597
  elif queue_tag == 'node':
578
598
  assert len(x) == 2, "expected message tuple to have exactly two elements"
@@ -290,8 +290,12 @@ class MonitoringHub(RepresentationMixin):
290
290
  self._dfk_channel.close()
291
291
  if exception_msgs:
292
292
  for exception_msg in exception_msgs:
293
- self.logger.error("{} process delivered an exception: {}. Terminating all monitoring processes immediately.".format(exception_msg[0],
294
- exception_msg[1]))
293
+ self.logger.error(
294
+ "{} process delivered an exception: {}. Terminating all monitoring processes immediately.".format(
295
+ exception_msg[0],
296
+ exception_msg[1]
297
+ )
298
+ )
295
299
  self.router_proc.terminate()
296
300
  self.dbm_proc.terminate()
297
301
  self.filesystem_proc.terminate()
@@ -201,6 +201,8 @@ def monitor(pid: int,
201
201
 
202
202
  children_user_time = {} # type: Dict[int, float]
203
203
  children_system_time = {} # type: Dict[int, float]
204
+ children_num_ctx_switches_voluntary = {} # type: Dict[int, float]
205
+ children_num_ctx_switches_involuntary = {} # type: Dict[int, float]
204
206
 
205
207
  def accumulate_and_prepare() -> Dict[str, Any]:
206
208
  d = {"psutil_process_" + str(k): v for k, v in pm.as_dict().items() if k in simple}
@@ -218,6 +220,15 @@ def monitor(pid: int,
218
220
  logging.debug("got children")
219
221
 
220
222
  d["psutil_cpu_count"] = psutil.cpu_count()
223
+
224
+ # note that this will be the CPU number of the base process, not anything launched by it
225
+ d["psutil_cpu_num"] = pm.cpu_num()
226
+
227
+ pctxsw = pm.num_ctx_switches()
228
+
229
+ d["psutil_process_num_ctx_switches_voluntary"] = pctxsw.voluntary
230
+ d["psutil_process_num_ctx_switches_involuntary"] = pctxsw.involuntary
231
+
221
232
  d['psutil_process_memory_virtual'] = pm.memory_info().vms
222
233
  d['psutil_process_memory_resident'] = pm.memory_info().rss
223
234
  d['psutil_process_time_user'] = pm.cpu_times().user
@@ -238,6 +249,11 @@ def monitor(pid: int,
238
249
  child_system_time = child.cpu_times().system
239
250
  children_user_time[child.pid] = child_user_time
240
251
  children_system_time[child.pid] = child_system_time
252
+
253
+ pctxsw = child.num_ctx_switches()
254
+ children_num_ctx_switches_voluntary[child.pid] = pctxsw.voluntary
255
+ children_num_ctx_switches_involuntary[child.pid] = pctxsw.involuntary
256
+
241
257
  d['psutil_process_memory_virtual'] += child.memory_info().vms
242
258
  d['psutil_process_memory_resident'] += child.memory_info().rss
243
259
  try:
@@ -248,14 +264,27 @@ def monitor(pid: int,
248
264
  logging.exception("Exception reading IO counters for child {k}. Recorded IO usage may be incomplete".format(k=k), exc_info=True)
249
265
  d['psutil_process_disk_write'] += 0
250
266
  d['psutil_process_disk_read'] += 0
267
+
251
268
  total_children_user_time = 0.0
252
269
  for child_pid in children_user_time:
253
270
  total_children_user_time += children_user_time[child_pid]
271
+
254
272
  total_children_system_time = 0.0
255
273
  for child_pid in children_system_time:
256
274
  total_children_system_time += children_system_time[child_pid]
275
+
276
+ total_children_num_ctx_switches_voluntary = 0.0
277
+ for child_pid in children_num_ctx_switches_voluntary:
278
+ total_children_num_ctx_switches_voluntary += children_num_ctx_switches_voluntary[child_pid]
279
+
280
+ total_children_num_ctx_switches_involuntary = 0.0
281
+ for child_pid in children_num_ctx_switches_involuntary:
282
+ total_children_num_ctx_switches_involuntary += children_num_ctx_switches_involuntary[child_pid]
283
+
257
284
  d['psutil_process_time_user'] += total_children_user_time
258
285
  d['psutil_process_time_system'] += total_children_system_time
286
+ d['psutil_process_num_ctx_switches_voluntary'] += total_children_num_ctx_switches_voluntary
287
+ d['psutil_process_num_ctx_switches_involuntary'] += total_children_num_ctx_switches_involuntary
259
288
  logging.debug("sending message")
260
289
  return d
261
290
 
@@ -102,5 +102,12 @@ class Resource(db.Model):
102
102
  'psutil_process_disk_write', db.Float, nullable=True)
103
103
  psutil_process_status = db.Column(
104
104
  'psutil_process_status', db.Text, nullable=True)
105
+ psutil_cpu_num = db.Column(
106
+ 'psutil_cpu_num', db.Text, nullable=True)
107
+ psutil_process_num_ctx_switches_voluntary = db.Column(
108
+ 'psutil_process_num_ctx_switches_voluntary', db.Float, nullable=True)
109
+ psutil_process_num_ctx_switches_involuntary = db.Column(
110
+ 'psutil_process_num_ctx_switches_involuntary', db.Float, nullable=True)
111
+
105
112
  __table_args__ = (
106
113
  db.PrimaryKeyConstraint('task_id', 'run_id', 'timestamp'),)
@@ -280,11 +280,22 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
280
280
  else:
281
281
  logger.error("Could not read job ID from submit command standard output.")
282
282
  logger.error("Retcode:%s STDOUT:%s STDERR:%s", retcode, stdout.strip(), stderr.strip())
283
- raise SubmitException(job_name, "Could not read job ID from submit command standard output", stdout=stdout, stderr=stderr, retcode=retcode)
283
+ raise SubmitException(
284
+ job_name,
285
+ "Could not read job ID from submit command standard output",
286
+ stdout=stdout,
287
+ stderr=stderr,
288
+ retcode=retcode
289
+ )
284
290
  else:
285
291
  logger.error("Submit command failed")
286
292
  logger.error("Retcode:%s STDOUT:%s STDERR:%s", retcode, stdout.strip(), stderr.strip())
287
- raise SubmitException(job_name, "Could not read job ID from submit command standard output", stdout=stdout, stderr=stderr, retcode=retcode)
293
+ raise SubmitException(
294
+ job_name, "Could not read job ID from submit command standard output",
295
+ stdout=stdout,
296
+ stderr=stderr,
297
+ retcode=retcode
298
+ )
288
299
 
289
300
  def cancel(self, job_ids):
290
301
  ''' Cancels the jobs specified by a list of job ids
@@ -52,7 +52,9 @@ user_opts = {
52
52
  # 'username': MIDWAY_USERNAME,
53
53
  # 'script_dir': '/scratch/midway2/{}/parsl_scripts'.format(MIDWAY_USERNAME),
54
54
  # 'scheduler_options': "",
55
- # 'worker_init': 'cd /scratch/midway2/{}/parsl_scripts; module load Anaconda3/5.1.0; source activate parsl_testing;'.format(MIDWAY_USERNAME),
55
+ # 'worker_init': 'cd /scratch/midway2/{}/parsl_scripts; '
56
+ # 'module load Anaconda3/5.1.0; source activate parsl_testing;'
57
+ # .format(MIDWAY_USERNAME),
56
58
  # },
57
59
  # 'osg': {
58
60
  # 'username': OSG_USERNAME,
@@ -98,7 +98,8 @@ def test_scale_out(tmpd_cwd, try_assert):
98
98
 
99
99
  assert dfk.executors['htex_local'].outstanding == 0
100
100
 
101
- # now we can launch one "long" task - and what should happen is that the connected_managers count "eventually" (?) converges to 1 and stays there.
101
+ # now we can launch one "long" task -
102
+ # and what should happen is that the connected_managers count "eventually" (?) converges to 1 and stays there.
102
103
 
103
104
  finish_path = tmpd_cwd / "stage2_workers_may_continue"
104
105
 
@@ -109,7 +109,6 @@ class UsageTracker:
109
109
  sys.version_info.micro)
110
110
  self.tracking_enabled = self.check_tracking_enabled()
111
111
  logger.debug("Tracking status: {}".format(self.tracking_enabled))
112
- self.initialized = False # Once first message is sent this will be True
113
112
 
114
113
  def check_tracking_enabled(self):
115
114
  """Check if tracking is enabled.
@@ -176,15 +175,12 @@ class UsageTracker:
176
175
  except Exception as e:
177
176
  logger.debug("Usage tracking failed: {}".format(e))
178
177
 
179
- def send_message(self) -> None:
180
- """Send message over UDP.
181
- """
182
- if not self.initialized:
183
- message = self.construct_start_message()
184
- self.initialized = True
185
- else:
186
- message = self.construct_end_message()
178
+ def send_start_message(self) -> None:
179
+ message = self.construct_start_message()
180
+ self.send_UDP_message(message)
187
181
 
182
+ def send_end_message(self) -> None:
183
+ message = self.construct_end_message()
188
184
  self.send_UDP_message(message)
189
185
 
190
186
  def close(self, timeout: float = 10.0) -> None:
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 = '2024.03.04'
6
+ VERSION = '2024.03.11'
@@ -413,7 +413,9 @@ class Manager:
413
413
  raise WorkerLost(worker_id, platform.node())
414
414
  except Exception:
415
415
  logger.info("Putting exception for executor task {} in the pending result queue".format(task['task_id']))
416
- result_package = {'type': 'result', 'task_id': task['task_id'], 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
416
+ result_package = {'type': 'result',
417
+ 'task_id': task['task_id'],
418
+ 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
417
419
  pkl_package = pickle.dumps(result_package)
418
420
  self.pending_result_queue.put(pkl_package)
419
421
  except KeyError:
@@ -867,7 +869,10 @@ if __name__ == "__main__":
867
869
  block_id=args.block_id,
868
870
  cores_per_worker=float(args.cores_per_worker),
869
871
  mem_per_worker=None if args.mem_per_worker == 'None' else float(args.mem_per_worker),
870
- max_workers_per_node=args.max_workers_per_node if args.max_workers_per_node == float('inf') else int(args.max_workers_per_node),
872
+ max_workers_per_node=(
873
+ args.max_workers_per_node if args.max_workers_per_node == float('inf')
874
+ else int(args.max_workers_per_node)
875
+ ),
871
876
  prefetch_capacity=int(args.prefetch_capacity),
872
877
  heartbeat_threshold=int(args.hb_threshold),
873
878
  heartbeat_period=int(args.hb_period),
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.3.4
3
+ Version: 2024.3.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/2024.03.04.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.03.11.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -1,5 +1,5 @@
1
1
  parsl/__init__.py,sha256=hq8rJmP59wzd9-yxaGcmq5gPpshOopH-Y1K0BkUBNY0,1843
2
- parsl/addresses.py,sha256=bkaRhM4IZ4iZzh6ZkRXPvCLKFkbJ6HX2AOjYyujCiO8,4814
2
+ parsl/addresses.py,sha256=LjjYZhsuAQw50FyQEx1wKfhaNXlpOPcLnj0F3_YQoKA,4808
3
3
  parsl/config.py,sha256=ysUWBfm9bygayHHdItaJbP4oozkHJJmVQVnWCt5igjE,6808
4
4
  parsl/curvezmq.py,sha256=FtZEYP1IWDry39cH-tOKUm9TnaR1U7krOmvVYpATcOk,6939
5
5
  parsl/errors.py,sha256=SzINzQFZDBDbj9l-DPQznD0TbGkNhHIRAPkcBCogf_A,1019
@@ -8,7 +8,7 @@ parsl/multiprocessing.py,sha256=hakfdg-sgxEjwloZeDrt6EhzwdzecvjJhkPHHxh8lII,1938
8
8
  parsl/process_loggers.py,sha256=1G3Rfrh5wuZNo2X03grG4kTYPGOxz7hHCyG6L_A3b0A,1137
9
9
  parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  parsl/utils.py,sha256=PyJSz5BTlWTmVt01V2ueJPQYnrHMUwJlilSmW40oUJw,10956
11
- parsl/version.py,sha256=ODY44drCZ6Fm8zGrPlvCOx5A8Gj1S9vNmgUi6ufUFKo,131
11
+ parsl/version.py,sha256=n-auQw6rmeOyMm-tuSSnWf2Lj2VPfiF3nix6T-dWYsw,131
12
12
  parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  parsl/app/app.py,sha256=wAHchJetgnicT1pn0NJKDeDX0lV3vDFlG8cQd_Ciax4,8522
14
14
  parsl/app/bash.py,sha256=bx9x1XFwkOTpZZD3CPwnVL9SyNRDjbUGtOnuGLvxN_8,5396
@@ -33,7 +33,6 @@ parsl/configs/ASPIRE1.py,sha256=jZXNH2dWTv3gDdQ4EB7j3nQB-iDn6ADIOj9BOidxbRo,1637
33
33
  parsl/configs/Azure.py,sha256=0QJeM7TvMIpSBl-S_qAOAKwnmiwtHYY_D4kHDjKHkp0,1192
34
34
  parsl/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  parsl/configs/ad_hoc.py,sha256=tN07tj1GnZeVKTSemT77j1YUk1r0IF744Idvfq2Y9YM,1275
36
- parsl/configs/bluewaters.py,sha256=iQEYxsm4V3nEY8o-d2npxi9UzZ7WohIFvuK8TXaPlSo,891
37
36
  parsl/configs/bridges.py,sha256=ZRMUe5l23c71rRYPYh6vO6BGFnewWuGPYO4nC1ydryI,1446
38
37
  parsl/configs/cc_in2p3.py,sha256=Vqn_v7xGB18JzC57mW3Qz94Ua1AWjU5aWwCrXXCBG-Y,709
39
38
  parsl/configs/ec2.py,sha256=-vzlv3YpFfX7kpCYWHJFvdDqFZfj0leR6sEaus3Ydoo,868
@@ -61,13 +60,13 @@ parsl/data_provider/http.py,sha256=nDHTW7XmJqAukWJjPRQjyhUXt8r6GsQ36mX9mv_wOig,2
61
60
  parsl/data_provider/rsync.py,sha256=2-ZxqrT-hBj39x082NusJaBqsGW4Jd2qCW6JkVPpEl0,4254
62
61
  parsl/data_provider/staging.py,sha256=l-mAXFburs3BWPjkSmiQKuAgJpsxCG62yATPDbrafYI,4523
63
62
  parsl/dataflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- parsl/dataflow/dflow.py,sha256=thxwgWI5F2twW4P_bsy1-ZERAfJIbqb1uI7uGGbhmRU,63873
63
+ parsl/dataflow/dflow.py,sha256=pkfhp3hBKivmE-xmMFXCxVogC_ZFqWfDm0BlzhpSVV8,64148
65
64
  parsl/dataflow/errors.py,sha256=w2vOt_ymzG2dOqJUO4IDcmTlrCIHlMZL8nBVyVq0O_8,2176
66
65
  parsl/dataflow/futures.py,sha256=aVfEUTzp4-EdunDAtNcqVQf8l_A7ArDi2c82KZMwxfY,5256
67
66
  parsl/dataflow/memoization.py,sha256=AsJO6c6cRp2ac6H8uGn2USlEi78_nX3QWvpxYt4XdYE,9583
68
67
  parsl/dataflow/rundirs.py,sha256=XKmBZpBEIsGACBhYOkbbs2e5edC0pQegJcSlk4FWeag,1154
69
68
  parsl/dataflow/states.py,sha256=hV6mfv-y4A6xrujeQglcomnfEs7y3Xm2g6JFwC6dvgQ,2612
70
- parsl/dataflow/taskrecord.py,sha256=QlsOUacZZq-sU25P-VmA0xDVUktRFEVRmJoWv3Oyzz0,3105
69
+ parsl/dataflow/taskrecord.py,sha256=bzIBmlDTsRrELtB9PUQwxTWcwrCd8aMsUAzvijle1eo,3114
71
70
  parsl/executors/__init__.py,sha256=J50N97Nm9YRjz6K0oNXDxUYIsDjL43_tp3LVb2w7n-M,381
72
71
  parsl/executors/base.py,sha256=DyKzXZztPagh9xQykTUuJRMR9g3i6qkbZi8YpWrIfXM,4340
73
72
  parsl/executors/errors.py,sha256=xVswxgi7vmJcUMCeYDAPK8sQT2kHFFROVoOr0dnmcWE,2098
@@ -79,14 +78,14 @@ parsl/executors/flux/executor.py,sha256=0omXRPvykdW5VZb8mwgBJjxVk4H6G8xoL5D_R9pu
79
78
  parsl/executors/flux/flux_instance_manager.py,sha256=tTEOATClm9SwdgLeBRWPC6D55iNDuh0YxqJOw3c3eQ4,2036
80
79
  parsl/executors/high_throughput/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
80
  parsl/executors/high_throughput/errors.py,sha256=vl69wLuVOplbKxHI9WphEGBExHWkTn5n8T9QhBXuNH0,380
82
- parsl/executors/high_throughput/executor.py,sha256=aHA0w80DcSKUrJ0blAgbqRAcjLAg6cJUalDyVEOYa8o,36464
83
- parsl/executors/high_throughput/interchange.py,sha256=9wx06FmbOwBTmZsFeBMt5pLWYySsBBBi3kwUfoeW7iQ,30200
81
+ parsl/executors/high_throughput/executor.py,sha256=oG32cJ17MkuMLLcY-rkUGN6CNx5ygeQcCiN5Mo5TIZQ,36927
82
+ parsl/executors/high_throughput/interchange.py,sha256=QhjIhSnhihNJheVBNyBZA6gRX1x5h-8jRdQJ1cDPMRk,30309
84
83
  parsl/executors/high_throughput/manager_record.py,sha256=T8-JVMfDJU6SJfzJRooD0mO8AHGMXlcn3PBOM0m_vng,366
85
84
  parsl/executors/high_throughput/monitoring_info.py,sha256=3gQpwQjjNDEBz0cQqJZB6hRiwLiWwXs83zkQDmbOwxY,297
86
85
  parsl/executors/high_throughput/mpi_prefix_composer.py,sha256=GPSejuNL407gvzw9f7dTWArTLn6heTi-erJjgcM-_8Y,4273
87
86
  parsl/executors/high_throughput/mpi_resource_management.py,sha256=geLYmp2teKYgTnzATAR_JPtjAa0ysu6pHpXs90vwkds,7975
88
87
  parsl/executors/high_throughput/probe.py,sha256=lvnuf-vBv57tHvFh-J51F9sDYBES7jCgs6KYgWvmKRs,2749
89
- parsl/executors/high_throughput/process_worker_pool.py,sha256=Xe6QlpYLrOsjxE5nXErxj8OvqBVgIEUy21m9a3tBxEc,39108
88
+ parsl/executors/high_throughput/process_worker_pool.py,sha256=H8SXtCRtG3sZYJgiBIMDnM8SeJByHZqIoL9x7z9bMxo,39290
90
89
  parsl/executors/high_throughput/zmq_pipes.py,sha256=TEIr1PcBDVbchBukzPaEsku2lbIIFCYYjeUq5zw_VBA,6514
91
90
  parsl/executors/radical/__init__.py,sha256=CKbtV2numw5QvgIBq1htMUrt9TqDCIC2zifyf2svTNU,186
92
91
  parsl/executors/radical/executor.py,sha256=5r9WZkOr0clg79zm35E7nC7zNv0DpbyM8iTC2B6d4N0,21024
@@ -96,7 +95,7 @@ parsl/executors/radical/rpex_worker.py,sha256=1M1df-hzFdmZMWbRZlUzIX7uAWMKJ_SkxL
96
95
  parsl/executors/taskvine/__init__.py,sha256=sWIJdvSLgQKul9dlSjIkNat7yBDgU3SrBF3X2yhT86E,293
97
96
  parsl/executors/taskvine/errors.py,sha256=MNS_NjpvHjwevQXOjqjSEBFroqEWi-LT1ZEVZ2C5Dx0,652
98
97
  parsl/executors/taskvine/exec_parsl_function.py,sha256=oUAKbPWwpbzWwQ47bZQlVDxS8txhnhPsonMf3AOEMGQ,7085
99
- parsl/executors/taskvine/executor.py,sha256=07BJsXPKRwT6hYbQRf84C1k6m3woqq4SM8ZIa9KTUiA,31404
98
+ parsl/executors/taskvine/executor.py,sha256=usevSTpiNIQb0WEreTx-6NbULPMJIeHgzLb4GRwjIOI,31433
100
99
  parsl/executors/taskvine/factory.py,sha256=sHhfGv7xRFrWkQclzRXuFEAHuSXhsZu2lR5LJ81aucA,2638
101
100
  parsl/executors/taskvine/factory_config.py,sha256=AbE2fN2snrF5ITYrrS4DnGn2XkJHUFr_17DYHDHIwq0,3693
102
101
  parsl/executors/taskvine/manager.py,sha256=X4Fir46doc4qMdTSKNfyS78HvhnUqq7Rw7jCvbD0Tfw,25732
@@ -113,23 +112,23 @@ parsl/jobs/error_handlers.py,sha256=dvfZFqTwAcFXrIx3sjFTcjtwOB0-xGn6QnPwJEG-kAI,
113
112
  parsl/jobs/errors.py,sha256=cpSQXCrlKtuHsQf7usjF-lX8XsDkFnE5kWpmFjiN6OU,178
114
113
  parsl/jobs/job_status_poller.py,sha256=MUwxrVtAGDAaurMw_eksWcoGXloABlAOavgPHmWGscI,5285
115
114
  parsl/jobs/states.py,sha256=rPBoAEEudKngWFijlwvXXhAagDs_9DCXvQP9rwzVgCM,4855
116
- parsl/jobs/strategy.py,sha256=oxw_X7EzO1fanmxj3quH7AINcuQWw1gfeHkOoKO36lI,12926
115
+ parsl/jobs/strategy.py,sha256=a-W3vxEHHCfe521LMfSoZLpJjdTtwCfTgdn1ChxzUuI,12959
117
116
  parsl/launchers/__init__.py,sha256=k8zAB3IBP-brfqXUptKwGkvsIRaXjAJZNBJa2XVtY1A,546
118
117
  parsl/launchers/base.py,sha256=CblcvPTJiu-MNLWaRtFe29SZQ0BpTOlaY8CGcHdlHIE,538
119
118
  parsl/launchers/errors.py,sha256=v5i460H_rovzukSccQetxQBVtd92jLQz-NbuDe2TdGI,467
120
119
  parsl/launchers/launchers.py,sha256=t9nuX38GMlAUPHs0aksnMd_5jI59IcqwlUD667w1cu4,15358
121
120
  parsl/monitoring/__init__.py,sha256=0ywNz6i0lM1xo_7_BIxhETDGeVd2C_0wwD7qgeaMR4c,83
122
- parsl/monitoring/db_manager.py,sha256=impNMJ92oACMCxXS0qBizRviN7-29Kjvs5m8p3Em1ZQ,36308
121
+ parsl/monitoring/db_manager.py,sha256=DeFzJCn9pKHFEIvAogPQVTZPqbaLUwKs79RQM8K6bX4,36945
123
122
  parsl/monitoring/message_type.py,sha256=Khn88afNxcOIciKiCK4GLnn90I5BlRTiOL3zK-P07yQ,401
124
- parsl/monitoring/monitoring.py,sha256=RlfbdH6kre3CXWi0kppUKjEVQrp1DQQxMfvZCwq7Vus,24855
123
+ parsl/monitoring/monitoring.py,sha256=YauAj-0xryXqAe_SOFoXIPL0Kt3lN_vC_9GWbMtK2AE,24945
125
124
  parsl/monitoring/radios.py,sha256=T2_6QuUjC-dd_7qMnIk6WHQead1iWz7m_P6ZC4QAqdA,5265
126
- parsl/monitoring/remote.py,sha256=88KYckdqCcGYWNxpkBETdNg4YVP8UkMLNcJDT4ffq_s,12552
125
+ parsl/monitoring/remote.py,sha256=OcIgudujtPO_DsY-YV36x92skeiNdGt-6aEOqaCU8T0,13900
127
126
  parsl/monitoring/types.py,sha256=SO6Fjjbb83sv_MtbutoxGssiWh6oXKkEEsD4EvwOnZ4,629
128
127
  parsl/monitoring/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
128
  parsl/monitoring/queries/pandas.py,sha256=J09lIxSvVtAfBTbFcwKgUkHwZfaS6vYOzXHxS7UBLoc,2233
130
129
  parsl/monitoring/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
130
  parsl/monitoring/visualization/app.py,sha256=_RZNBHWJYKwadusPE5p0uFMTqKqI3gI2fBzC8SpspsY,1423
132
- parsl/monitoring/visualization/models.py,sha256=rwFsVrTKaszHDg4LpN7xfZF4XmetXgKyFg6UN-Qo9Bg,4778
131
+ parsl/monitoring/visualization/models.py,sha256=-pzynw6PCh-7_Kat4cqDFt9wAKbo9lWjF4O2muBqDDc,5139
133
132
  parsl/monitoring/visualization/utils.py,sha256=IIKnDdHSkvk6e8q-1O9cE-DclPMdrhXbum04EDDYI-0,314
134
133
  parsl/monitoring/visualization/version.py,sha256=mjxUkRW-XaF1dhu2IEUPPviGpfOvbxhWfTOYl250lVs,134
135
134
  parsl/monitoring/visualization/views.py,sha256=fsuVVGl1spq7eCulqRRXPj2mqzC6vlvD8yW31XTbCK0,8172
@@ -183,7 +182,7 @@ parsl/providers/pbspro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
183
182
  parsl/providers/pbspro/pbspro.py,sha256=Uo6XvXZ3HwotfvrzFtaE1Wf4pta1LoqM4GgkQUTXv4A,8822
184
183
  parsl/providers/pbspro/template.py,sha256=y-Dher--t5Eury-c7cAuSZs9FEUXWiruFUI07v81558,315
185
184
  parsl/providers/slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
- parsl/providers/slurm/slurm.py,sha256=ormNss2s8NVrrS-QZobuzrDlbEolDm6ZdyHD5vgrzsU,13720
185
+ parsl/providers/slurm/slurm.py,sha256=HnDZk2owmNz_r6Spwlu233HbQLo9dWePy3KD4CXXRRs,13916
187
186
  parsl/providers/slurm/template.py,sha256=KpgBEFMc1ps-38jdrk13xUGx9TCivu-iF90jgQDdiEQ,315
188
187
  parsl/providers/torque/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
188
  parsl/providers/torque/template.py,sha256=4qfc2gmlEhRCAD7erFDOs4prJQ43I8s4E8DSUSVQx3A,358
@@ -241,7 +240,7 @@ parsl/tests/configs/summit.py,sha256=_Dd8r5mod30QRCSp16BlzsQYSKbdM71Rt4azvz9Pzfk
241
240
  parsl/tests/configs/swan_htex.py,sha256=5mIYnzwOFEQ8fNsepP9QjFj9ZMW2m8u4pJluZ5BZGpw,1501
242
241
  parsl/tests/configs/taskvine_ex.py,sha256=e_sXe3d-uSL8cli19-xrBloqQcEQQ4tKVa_x_aDcYGM,632
243
242
  parsl/tests/configs/theta.py,sha256=d5fLCW7SpgKkH3K8iRzj6IhsDozlKr4qgDrQ6Dv1bYA,1298
244
- parsl/tests/configs/user_opts.py,sha256=8gDzQWuiKQMXq1BV6nDXpaC4dn5j0vtRNVwUyoQbUBM,6184
243
+ parsl/tests/configs/user_opts.py,sha256=c586f66gOY5f1CdgakKvw1JFFzEm1z4ewoxbQx78DUg,6238
245
244
  parsl/tests/configs/workqueue_ex.py,sha256=5gbjlGECkUd0p9PJbq-IBYARlEbEBiPpXWgHn1GC1d8,514
246
245
  parsl/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
246
  parsl/tests/integration/latency.py,sha256=kWYkXsbnVnpwS6rHsdm7a1FsUOJWHhuXDsRPlApw6iE,3289
@@ -412,7 +411,7 @@ parsl/tests/test_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
412
411
  parsl/tests/test_scaling/test_block_error_handler.py,sha256=VFKs_jq7yd7bpdfYva3Sa_TBS8VcjGUS6YJ9Y34RbyI,6050
413
412
  parsl/tests/test_scaling/test_regression_1621.py,sha256=iRu3GFsg2l9J61AVZKWLc6zJcvI2JYD0WvtTYDSv22I,1770
414
413
  parsl/tests/test_scaling/test_scale_down.py,sha256=T8NVmoIebdpSjrNJCdgDHumpz9eKLkJrpeW7Kwi8cBg,2821
415
- parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py,sha256=hwM2MAQTIT2wyvHdT0Tf4P7Kvm6eq8S3FqCNl_QOnF8,5030
414
+ parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py,sha256=h85esh-5O76PZZWAneS7-b_clhgfxIyVivNuxtcpQJ8,5036
416
415
  parsl/tests/test_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
417
416
  parsl/tests/test_serialization/test_2555_caching_deserializer.py,sha256=J8__b4djA5tErd8FUSXGkGcdXlW2KHbBWRbCTAnV08Q,767
418
417
  parsl/tests/test_serialization/test_basic.py,sha256=51KshqIk2RNr7S2iSkl5tZo40CJBb0h6uby8YPgOGlg,543
@@ -436,13 +435,13 @@ parsl/tests/test_threads/test_lazy_errors.py,sha256=nGhYfCMHFZYSy6YJ4gnAmiLl9SfY
436
435
  parsl/tests/test_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
436
  parsl/tests/test_utils/test_representation_mixin.py,sha256=kUZeIDwA2rlbJ3-beGzLLwf3dOplTMCrWJN87etHcyY,1633
438
437
  parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
439
- parsl/usage_tracking/usage.py,sha256=WSfllOV4bDveCaHSG2i39-si1lNHAqi__iY_hbf5OPk,6817
440
- parsl-2024.3.4.data/scripts/exec_parsl_function.py,sha256=NtWNeBvRqksej38eRPw8zPBJ1CeW6vgaitve0tfz_qc,7801
441
- parsl-2024.3.4.data/scripts/parsl_coprocess.py,sha256=Y7Tc-h9WGui-YDe3w_h91w2Sm1JNL1gJ9kAV4PE_gw8,5722
442
- parsl-2024.3.4.data/scripts/process_worker_pool.py,sha256=ycbGMSMSWVq4hJCENzNvivyMUKC5b0bNl8mCdgcY1po,39094
443
- parsl-2024.3.4.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
444
- parsl-2024.3.4.dist-info/METADATA,sha256=_lE8idHENNC5h4Tm9ix3Khy82v771dBvhjMqQspNVQs,3959
445
- parsl-2024.3.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
446
- parsl-2024.3.4.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
447
- parsl-2024.3.4.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
448
- parsl-2024.3.4.dist-info/RECORD,,
438
+ parsl/usage_tracking/usage.py,sha256=pSADeogWqvkYI_n2pojv4IWDEFAQ3KwXNx6LDTohMHQ,6684
439
+ parsl-2024.3.11.data/scripts/exec_parsl_function.py,sha256=NtWNeBvRqksej38eRPw8zPBJ1CeW6vgaitve0tfz_qc,7801
440
+ parsl-2024.3.11.data/scripts/parsl_coprocess.py,sha256=Y7Tc-h9WGui-YDe3w_h91w2Sm1JNL1gJ9kAV4PE_gw8,5722
441
+ parsl-2024.3.11.data/scripts/process_worker_pool.py,sha256=4qe-PIxiJiIbuZsxvW82qnG1myo9UYzr_IhX-Dk3nzo,39276
442
+ parsl-2024.3.11.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
443
+ parsl-2024.3.11.dist-info/METADATA,sha256=PoVGqk84z5yI7sYhj_OQ7wmREyBMBQ5A3RwEWR0n9jc,3960
444
+ parsl-2024.3.11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
445
+ parsl-2024.3.11.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
446
+ parsl-2024.3.11.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
447
+ parsl-2024.3.11.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,28 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import HighThroughputExecutor
3
- from parsl.launchers import AprunLauncher
4
- from parsl.providers import TorqueProvider
5
-
6
-
7
- config = Config(
8
- executors=[
9
- HighThroughputExecutor(
10
- label="bw_htex",
11
- cores_per_worker=1,
12
- worker_debug=False,
13
- provider=TorqueProvider(
14
- queue='normal',
15
- launcher=AprunLauncher(overrides="-b -- bwpy-environ --"),
16
- scheduler_options='', # string to prepend to #SBATCH blocks in the submit script to the scheduler
17
- worker_init='', # command to run before starting a worker, such as 'source activate env'
18
- init_blocks=1,
19
- max_blocks=1,
20
- min_blocks=1,
21
- nodes_per_block=2,
22
- walltime='00:10:00'
23
- ),
24
- )
25
-
26
- ],
27
-
28
- )