Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _ftp_stage_in(working_dir, outputs=[]):
file = outputs[0]
if working_dir:
os.makedirs(working_dir, exist_ok=True)
file.local_path = os.path.join(working_dir, file.filename)
else:
file.local_path = file.filename
with open(file.local_path, 'wb') as f:
ftp = ftplib.FTP(file.netloc)
ftp.login()
ftp.cwd(os.path.dirname(file.path))
ftp.retrbinary('RETR {}'.format(file.filename), f.write)
ftp.quit()
class DataManager(ParslExecutor):
"""The DataManager is responsible for transferring input and output data.
It uses the Executor interface, where staging tasks are submitted
to it, and DataFutures are returned.
"""
@classmethod
def get_data_manager(cls):
"""Return the DataManager of the currently loaded DataFlowKernel.
"""
from parsl.dataflow.dflow import DataFlowKernelLoader
dfk = DataFlowKernelLoader.dfk()
return dfk.executors['data_manager']
def __init__(self, dfk, max_threads=10):
from parsl.utils import RepresentationMixin
from parsl.providers import LocalProvider
from funcx.executors.high_throughput import zmq_pipes
logger = logging.getLogger(__name__)
BUFFER_THRESHOLD = 1024 * 1024
ITEM_THRESHOLD = 1024
class HighThroughputExecutor(ParslExecutor, RepresentationMixin):
"""Executor designed for cluster-scale
The HighThroughputExecutor system has the following components:
1. The HighThroughputExecutor instance which is run as part of the Parsl script.
2. The Interchange which is acts as a load-balancing proxy between workers and Parsl
3. The multiprocessing based worker pool which coordinates task execution over several
cores on a node.
4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
Here is a diagram
.. code:: python
| Data | Executor | Interchange | External Process(es)
| Flow | | |
from ipyparallel.serialize import pack_apply_message # ,unpack_apply_message
from ipyparallel.serialize import deserialize_object # ,serialize_object
from parsl.executors.low_latency import zmq_pipes
from parsl.executors.low_latency import interchange
from parsl.executors.errors import ScalingFailed, DeserializationError, BadMessage
from parsl.executors.base import ParslExecutor
from parsl.providers.provider_base import JobStatus
from parsl.utils import RepresentationMixin
from parsl.providers import LocalProvider
logger = logging.getLogger(__name__)
class LowLatencyExecutor(ParslExecutor, RepresentationMixin):
"""
TODO: docstring for LowLatencyExecutor
"""
def __init__(self,
label='LowLatencyExecutor',
provider=LocalProvider(),
launch_cmd=None,
address="127.0.0.1",
worker_port=None,
worker_port_range=(54000, 55000),
interchange_port_range=(55000, 56000),
# storage_access=None,
working_dir=None,
worker_debug=False,
workers_per_node=1,
logger.debug("Updating Future for Parsl Task {}".format(parsl_tid))
if result["failure"] is False:
future.set_result(future_update)
else:
future_fail = pickle.loads(future_update)
exc = RemoteExceptionWrapper(*future_fail)
try:
exc.reraise()
except Exception as e:
future.set_exception(e)
logger.debug("Exiting Collector Thread")
return
class WorkQueueExecutor(ParslExecutor):
"""Executor to use Work Queue batch system
The WorkQueueExecutor system utilizes the Work Queue framework to
efficiently delegate Parsl apps to remote machines in clusters and
grids using a fault-tolerant system. Users can run the
work_queue_worker program on remote machines to connect to the
WorkQueueExecutor, and Parsl apps will then be sent out to these
machines for execution and retrieval.
Parameters
----------
label: str
A human readable label for the executor, unique
with respect to other Work Queue master programs
import uuid
from ipyparallel import Client
from parsl.providers import LocalProvider
from parsl.utils import RepresentationMixin
from parsl.dataflow.error import ConfigurationError
from parsl.executors.base import ParslExecutor
from parsl.executors.errors import *
from parsl.executors.ipp_controller import Controller
from parsl.utils import wait_for_file
logger = logging.getLogger(__name__)
class IPyParallelExecutor(ParslExecutor, RepresentationMixin):
"""The IPython Parallel executor.
This executor uses IPythonParallel's pilot execution system to manage multiple processes
running locally or remotely.
Parameters
----------
provider : :class:`~parsl.providers.provider_base.ExecutionProvider`
Provider to access computation resources. Can be one of :class:`~parsl.providers.aws.aws.EC2Provider`,
:class:`~parsl.providers.cobalt.cobalt.Cobalt`,
:class:`~parsl.providers.condor.condor.Condor`,
:class:`~parsl.providers.googlecloud.googlecloud.GoogleCloud`,
:class:`~parsl.providers.gridEngine.gridEngine.GridEngine`,
:class:`~parsl.providers.jetstream.jetstream.Jetstream`,
:class:`~parsl.providers.local.local.Local`,
:class:`~parsl.providers.sge.sge.GridEngine`,
init_blocks = 3
if hasattr(self.provider, 'init_blocks'):
init_blocks = self.provider.init_blocks # type: ignore
error_handler.simple_error_handler(self, status, init_blocks)
return True
@property
def tasks(self) -> Dict[str, Future]:
return self._tasks
@property
def provider(self):
return self._provider
class NoStatusHandlingExecutor(ParslExecutor):
def __init__(self):
super().__init__()
self._tasks = {}
@property
def status_polling_interval(self):
return -1
@property
def bad_state_is_set(self):
return False
@property
def error_management_enabled(self):
return False
import logging
import sys
import typeguard
import concurrent.futures as cf
from typing import Any, List, Optional
from parsl.executors.base import ParslExecutor
from parsl.utils import RepresentationMixin
logger = logging.getLogger(__name__)
class ThreadPoolExecutor(ParslExecutor, RepresentationMixin):
"""A thread-based executor.
Parameters
----------
max_threads : int
Number of threads. Default is 2.
thread_name_prefix : string
Thread name prefix (only supported in python v3.6+).
storage_access : list of :class:`~parsl.data_provider.staging.Staging`
Specifications for accessing data this executor remotely.
managed : bool
If True, parsl will control dynamic scaling of this executor, and be responsible. Otherwise,
this is managed by the user.
"""
@typeguard.typechecked
from parsl.executors.base import ParslExecutor
from parsl.dataflow.error import ConfigurationError
from parsl.utils import RepresentationMixin
from parsl.providers import LocalProvider
from funcx.executors.high_throughput import zmq_pipes
logger = logging.getLogger(__name__)
BUFFER_THRESHOLD = 1024 * 1024
ITEM_THRESHOLD = 1024
class HighThroughputExecutor(ParslExecutor, RepresentationMixin):
"""Executor designed for cluster-scale
The HighThroughputExecutor system has the following components:
1. The HighThroughputExecutor instance which is run as part of the Parsl script.
2. The Interchange which is acts as a load-balancing proxy between workers and Parsl
3. The multiprocessing based worker pool which coordinates task execution over several
cores on a node.
4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
Here is a diagram
.. code:: python
| Data | Executor | Interchange | External Process(es)
| Flow | | |
from parsl.executors.mpix import zmq_pipes
from parsl.executors.mpix import interchange
from parsl.executors.errors import *
from parsl.executors.base import ParslExecutor
from parsl.dataflow.error import ConfigurationError
from parsl.utils import RepresentationMixin
from parsl.providers import LocalProvider
logger = logging.getLogger(__name__)
BUFFER_THRESHOLD = 1024 * 1024
ITEM_THRESHOLD = 1024
class MPIExecutor(ParslExecutor, RepresentationMixin):
"""The MPI executor.
The MPI Executor system has 3 components:
1. The MPIExecutor instance which is run as part of the Parsl script.
2. The MPI based fabric which coordinates task execution over several nodes.
3. ZeroMQ pipes that connect the MPIExecutor and the fabric
Our design assumes that there is a single fabric running over a `block` and that
there might be several such `fabric` instances.
Here is a diagram
.. code:: python
| Data | Executor | Interchange | External Process(es)
import pathlib
import uuid
from ipyparallel import Client
from parsl.providers import LocalProvider
from parsl.utils import RepresentationMixin
from parsl.executors.base import ParslExecutor
from parsl.executors.errors import ScalingFailed
from parsl.executors.ipp_controller import Controller
from parsl.utils import wait_for_file
logger = logging.getLogger(__name__)
class IPyParallelExecutor(ParslExecutor, RepresentationMixin):
"""The IPython Parallel executor.
This executor uses IPythonParallel's pilot execution system to manage multiple processes
running locally or remotely.
Parameters
----------
provider : :class:`~parsl.providers.provider_base.ExecutionProvider`
Provider to access computation resources. Can be one of :class:`~parsl.providers.aws.aws.EC2Provider`,
:class:`~parsl.providers.cobalt.cobalt.Cobalt`,
:class:`~parsl.providers.condor.condor.Condor`,
:class:`~parsl.providers.googlecloud.googlecloud.GoogleCloud`,
:class:`~parsl.providers.gridEngine.gridEngine.GridEngine`,
:class:`~parsl.providers.jetstream.jetstream.Jetstream`,
:class:`~parsl.providers.local.local.Local`,
:class:`~parsl.providers.sge.sge.GridEngine`,