parsl 2024.7.29__py3-none-any.whl → 2024.8.12__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/channels/__init__.py +1 -4
- parsl/channels/oauth_ssh/oauth_ssh.py +2 -2
- parsl/channels/ssh/ssh.py +1 -1
- parsl/channels/ssh_il/ssh_il.py +2 -2
- parsl/dataflow/dflow.py +2 -2
- parsl/executors/base.py +7 -7
- parsl/executors/high_throughput/executor.py +15 -7
- parsl/executors/high_throughput/interchange.py +40 -37
- parsl/executors/high_throughput/manager_selector.py +25 -0
- parsl/executors/status_handling.py +38 -24
- parsl/executors/taskvine/executor.py +2 -0
- parsl/executors/workqueue/executor.py +2 -0
- parsl/monitoring/db_manager.py +10 -10
- parsl/monitoring/errors.py +6 -0
- parsl/monitoring/monitoring.py +3 -3
- parsl/monitoring/radios.py +16 -0
- parsl/monitoring/remote.py +4 -4
- parsl/monitoring/router.py +71 -35
- parsl/providers/__init__.py +0 -4
- parsl/providers/ad_hoc/ad_hoc.py +6 -2
- parsl/tests/configs/local_adhoc.py +2 -2
- parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
- parsl/tests/test_htex/test_htex.py +28 -19
- parsl/tests/test_htex/test_zmq_binding.py +4 -1
- parsl/tests/test_monitoring/test_basic.py +14 -1
- parsl/tests/test_mpi_apps/test_mpiex.py +1 -1
- parsl/tests/test_providers/test_local_provider.py +6 -5
- parsl/version.py +1 -1
- {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/interchange.py +40 -37
- parsl-2024.8.12.dist-info/METADATA +101 -0
- {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/RECORD +38 -46
- {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/WHEEL +1 -1
- parsl/configs/ad_hoc.py +0 -38
- parsl/tests/configs/ad_hoc_cluster_htex.py +0 -35
- parsl/tests/configs/htex_ad_hoc_cluster.py +0 -26
- parsl/tests/configs/swan_htex.py +0 -43
- parsl/tests/integration/test_channels/test_scp_1.py +0 -45
- parsl/tests/integration/test_channels/test_ssh_1.py +0 -40
- parsl/tests/integration/test_channels/test_ssh_errors.py +0 -46
- parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -41
- parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -24
- parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -49
- parsl/tests/manual_tests/test_oauth_ssh.py +0 -13
- parsl-2024.7.29.dist-info/METADATA +0 -101
- {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/exec_parsl_function.py +0 -0
- {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/parsl_coprocess.py +0 -0
- {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/process_worker_pool.py +0 -0
- {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/LICENSE +0 -0
- {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/entry_points.txt +0 -0
- {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/top_level.txt +0 -0
@@ -1,26 +0,0 @@
|
|
1
|
-
from parsl.channels import SSHChannel
|
2
|
-
from parsl.config import Config
|
3
|
-
from parsl.executors import HighThroughputExecutor
|
4
|
-
from parsl.providers import AdHocProvider
|
5
|
-
from parsl.tests.configs.user_opts import user_opts
|
6
|
-
|
7
|
-
config = Config(
|
8
|
-
executors=[
|
9
|
-
HighThroughputExecutor(
|
10
|
-
label='remote_htex',
|
11
|
-
cores_per_worker=1,
|
12
|
-
worker_debug=False,
|
13
|
-
address=user_opts['public_ip'],
|
14
|
-
encrypted=True,
|
15
|
-
provider=AdHocProvider(
|
16
|
-
move_files=False,
|
17
|
-
parallelism=1,
|
18
|
-
worker_init=user_opts['adhoc']['worker_init'],
|
19
|
-
channels=[SSHChannel(hostname=m,
|
20
|
-
username=user_opts['adhoc']['username'],
|
21
|
-
script_dir=user_opts['adhoc']['script_dir'],
|
22
|
-
) for m in user_opts['adhoc']['remote_hostnames']]
|
23
|
-
)
|
24
|
-
)
|
25
|
-
],
|
26
|
-
)
|
parsl/tests/configs/swan_htex.py
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
================== Block
|
3
|
-
| ++++++++++++++ | Node
|
4
|
-
| | | |
|
5
|
-
| | Task | | . . .
|
6
|
-
| | | |
|
7
|
-
| ++++++++++++++ |
|
8
|
-
==================
|
9
|
-
"""
|
10
|
-
from parsl.channels import SSHChannel
|
11
|
-
from parsl.config import Config
|
12
|
-
from parsl.executors import HighThroughputExecutor
|
13
|
-
from parsl.launchers import AprunLauncher
|
14
|
-
from parsl.providers import TorqueProvider
|
15
|
-
|
16
|
-
# If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
|
17
|
-
# If you are a user copying-and-pasting this as an example, make sure to either
|
18
|
-
# 1) create a local `user_opts.py`, or
|
19
|
-
# 2) delete the user_opts import below and replace all appearances of `user_opts` with the literal value
|
20
|
-
# (i.e., user_opts['swan']['username'] -> 'your_username')
|
21
|
-
from .user_opts import user_opts
|
22
|
-
|
23
|
-
config = Config(
|
24
|
-
executors=[
|
25
|
-
HighThroughputExecutor(
|
26
|
-
label='swan_htex',
|
27
|
-
encrypted=True,
|
28
|
-
provider=TorqueProvider(
|
29
|
-
channel=SSHChannel(
|
30
|
-
hostname='swan.cray.com',
|
31
|
-
username=user_opts['swan']['username'],
|
32
|
-
script_dir=user_opts['swan']['script_dir'],
|
33
|
-
),
|
34
|
-
nodes_per_block=1,
|
35
|
-
init_blocks=1,
|
36
|
-
max_blocks=1,
|
37
|
-
launcher=AprunLauncher(),
|
38
|
-
scheduler_options=user_opts['swan']['scheduler_options'],
|
39
|
-
worker_init=user_opts['swan']['worker_init'],
|
40
|
-
),
|
41
|
-
)
|
42
|
-
]
|
43
|
-
)
|
@@ -1,45 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
|
3
|
-
from parsl.channels.ssh.ssh import SSHChannel as SSH
|
4
|
-
|
5
|
-
|
6
|
-
def connect_and_list(hostname, username):
|
7
|
-
out = ''
|
8
|
-
conn = SSH(hostname, username=username)
|
9
|
-
conn.push_file(os.path.abspath('remote_run.sh'), '/home/davidk/')
|
10
|
-
# ec, out, err = conn.execute_wait("ls /tmp/remote_run.sh; bash /tmp/remote_run.sh")
|
11
|
-
conn.close()
|
12
|
-
return out
|
13
|
-
|
14
|
-
|
15
|
-
script = '''#!/bin/bash
|
16
|
-
echo "Hostname: $HOSTNAME"
|
17
|
-
echo "Cpu info -----"
|
18
|
-
cat /proc/cpuinfo
|
19
|
-
echo "Done----------"
|
20
|
-
'''
|
21
|
-
|
22
|
-
|
23
|
-
def test_connect_1():
|
24
|
-
with open('remote_run.sh', 'w') as f:
|
25
|
-
f.write(script)
|
26
|
-
|
27
|
-
sites = {
|
28
|
-
'midway': {
|
29
|
-
'url': 'midway.rcc.uchicago.edu',
|
30
|
-
'uname': 'yadunand'
|
31
|
-
},
|
32
|
-
'swift': {
|
33
|
-
'url': 'swift.rcc.uchicago.edu',
|
34
|
-
'uname': 'yadunand'
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
for site in sites.values():
|
39
|
-
out = connect_and_list(site['url'], site['uname'])
|
40
|
-
print("Sitename :{0} hostname:{1}".format(site['url'], out))
|
41
|
-
|
42
|
-
|
43
|
-
if __name__ == "__main__":
|
44
|
-
|
45
|
-
test_connect_1()
|
@@ -1,40 +0,0 @@
|
|
1
|
-
from parsl.channels.ssh.ssh import SSHChannel as SSH
|
2
|
-
|
3
|
-
|
4
|
-
def connect_and_list(hostname, username):
|
5
|
-
conn = SSH(hostname, username=username)
|
6
|
-
ec, out, err = conn.execute_wait("echo $HOSTNAME")
|
7
|
-
conn.close()
|
8
|
-
return out
|
9
|
-
|
10
|
-
|
11
|
-
def test_midway():
|
12
|
-
''' Test ssh channels to midway
|
13
|
-
'''
|
14
|
-
url = 'midway.rcc.uchicago.edu'
|
15
|
-
uname = 'yadunand'
|
16
|
-
out = connect_and_list(url, uname)
|
17
|
-
print("Sitename :{0} hostname:{1}".format(url, out))
|
18
|
-
|
19
|
-
|
20
|
-
def test_beagle():
|
21
|
-
''' Test ssh channels to beagle
|
22
|
-
'''
|
23
|
-
url = 'login04.beagle.ci.uchicago.edu'
|
24
|
-
uname = 'yadunandb'
|
25
|
-
out = connect_and_list(url, uname)
|
26
|
-
print("Sitename :{0} hostname:{1}".format(url, out))
|
27
|
-
|
28
|
-
|
29
|
-
def test_osg():
|
30
|
-
''' Test ssh connectivity to osg
|
31
|
-
'''
|
32
|
-
url = 'login.osgconnect.net'
|
33
|
-
uname = 'yadunand'
|
34
|
-
out = connect_and_list(url, uname)
|
35
|
-
print("Sitename :{0} hostname:{1}".format(url, out))
|
36
|
-
|
37
|
-
|
38
|
-
if __name__ == "__main__":
|
39
|
-
|
40
|
-
pass
|
@@ -1,46 +0,0 @@
|
|
1
|
-
from parsl.channels.errors import BadHostKeyException, SSHException
|
2
|
-
from parsl.channels.ssh.ssh import SSHChannel as SSH
|
3
|
-
|
4
|
-
|
5
|
-
def connect_and_list(hostname, username):
|
6
|
-
conn = SSH(hostname, username=username)
|
7
|
-
ec, out, err = conn.execute_wait("echo $HOSTNAME")
|
8
|
-
conn.close()
|
9
|
-
return out
|
10
|
-
|
11
|
-
|
12
|
-
def test_error_1():
|
13
|
-
try:
|
14
|
-
connect_and_list("bad.url.gov", "ubuntu")
|
15
|
-
except Exception as e:
|
16
|
-
assert type(e) is SSHException, "Expected SSException, got: {0}".format(e)
|
17
|
-
|
18
|
-
|
19
|
-
def test_error_2():
|
20
|
-
try:
|
21
|
-
connect_and_list("swift.rcc.uchicago.edu", "mango")
|
22
|
-
except SSHException:
|
23
|
-
print("Caught the right exception")
|
24
|
-
else:
|
25
|
-
raise Exception("Expected SSException, got: {0}".format(e))
|
26
|
-
|
27
|
-
|
28
|
-
def test_error_3():
|
29
|
-
''' This should work
|
30
|
-
'''
|
31
|
-
try:
|
32
|
-
connect_and_list("edison.nersc.gov", "yadunand")
|
33
|
-
except BadHostKeyException as e:
|
34
|
-
print("Caught exception BadHostKeyException: ", e)
|
35
|
-
else:
|
36
|
-
assert False, "Expected SSException, got: {0}".format(e)
|
37
|
-
|
38
|
-
|
39
|
-
if __name__ == "__main__":
|
40
|
-
|
41
|
-
tests = [test_error_1, test_error_2, test_error_3]
|
42
|
-
|
43
|
-
for test in tests:
|
44
|
-
print("---------Running : {0}---------------".format(test))
|
45
|
-
test()
|
46
|
-
print("----------------------DONE--------------------------")
|
@@ -1,41 +0,0 @@
|
|
1
|
-
import parsl
|
2
|
-
from parsl.channels.ssh.ssh import SSHChannel as SSH
|
3
|
-
|
4
|
-
|
5
|
-
def connect_and_list(hostname, username):
|
6
|
-
conn = SSH(hostname, username=username)
|
7
|
-
ec, out, err = conn.execute_wait("echo $HOSTNAME")
|
8
|
-
conn.close()
|
9
|
-
return out
|
10
|
-
|
11
|
-
|
12
|
-
def test_push(conn, fname="test001.txt"):
|
13
|
-
|
14
|
-
with open(fname, 'w') as f:
|
15
|
-
f.write("Hello from parsl.ssh testing\n")
|
16
|
-
|
17
|
-
conn.push_file(fname, "/tmp")
|
18
|
-
ec, out, err = conn.execute_wait("ls /tmp/{0}".format(fname))
|
19
|
-
print(ec, out, err)
|
20
|
-
|
21
|
-
|
22
|
-
def test_pull(conn, fname="test001.txt"):
|
23
|
-
|
24
|
-
local = "foo"
|
25
|
-
conn.pull_file("/tmp/{0}".format(fname), local)
|
26
|
-
|
27
|
-
with open("{0}/{1}".format(local, fname), 'r') as f:
|
28
|
-
print(f.readlines())
|
29
|
-
|
30
|
-
|
31
|
-
if __name__ == "__main__":
|
32
|
-
|
33
|
-
parsl.set_stream_logger()
|
34
|
-
|
35
|
-
# This is for testing
|
36
|
-
conn = SSH("midway.rcc.uchicago.edu", username="yadunand")
|
37
|
-
|
38
|
-
test_push(conn)
|
39
|
-
test_pull(conn)
|
40
|
-
|
41
|
-
conn.close()
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import parsl
|
2
|
-
from parsl.channels.ssh_il.ssh_il import SSHInteractiveLoginChannel as SSH
|
3
|
-
|
4
|
-
|
5
|
-
def connect_and_list(hostname, username):
|
6
|
-
conn = SSH(hostname, username=username)
|
7
|
-
ec, out, err = conn.execute_wait("echo $HOSTNAME")
|
8
|
-
conn.close()
|
9
|
-
return out
|
10
|
-
|
11
|
-
|
12
|
-
def test_cooley():
|
13
|
-
''' Test ssh channels to midway
|
14
|
-
'''
|
15
|
-
url = 'cooley.alcf.anl.gov'
|
16
|
-
uname = 'yadunand'
|
17
|
-
out = connect_and_list(url, uname)
|
18
|
-
print("Sitename :{0} hostname:{1}".format(url, out))
|
19
|
-
return
|
20
|
-
|
21
|
-
|
22
|
-
if __name__ == "__main__":
|
23
|
-
parsl.set_stream_logger()
|
24
|
-
test_cooley()
|
@@ -1,49 +0,0 @@
|
|
1
|
-
import parsl
|
2
|
-
from parsl import python_app
|
3
|
-
|
4
|
-
parsl.set_stream_logger()
|
5
|
-
|
6
|
-
from parsl.channels import SSHChannel
|
7
|
-
from parsl.config import Config
|
8
|
-
from parsl.executors import HighThroughputExecutor
|
9
|
-
from parsl.providers import AdHocProvider
|
10
|
-
|
11
|
-
remotes = ['midway2-login2.rcc.uchicago.edu', 'midway2-login1.rcc.uchicago.edu']
|
12
|
-
|
13
|
-
config = Config(
|
14
|
-
executors=[
|
15
|
-
HighThroughputExecutor(
|
16
|
-
label='AdHoc',
|
17
|
-
max_workers_per_node=2,
|
18
|
-
worker_logdir_root="/scratch/midway2/yadunand/parsl_scripts",
|
19
|
-
encrypted=True,
|
20
|
-
provider=AdHocProvider(
|
21
|
-
worker_init="source /scratch/midway2/yadunand/parsl_env_setup.sh",
|
22
|
-
channels=[SSHChannel(hostname=m,
|
23
|
-
username="yadunand",
|
24
|
-
script_dir="/scratch/midway2/yadunand/parsl_cluster")
|
25
|
-
for m in remotes]
|
26
|
-
)
|
27
|
-
)
|
28
|
-
]
|
29
|
-
)
|
30
|
-
|
31
|
-
|
32
|
-
@python_app
|
33
|
-
def platform(sleep=2, stdout=None):
|
34
|
-
import platform
|
35
|
-
import time
|
36
|
-
time.sleep(sleep)
|
37
|
-
return platform.uname()
|
38
|
-
|
39
|
-
|
40
|
-
def test_raw_provider():
|
41
|
-
|
42
|
-
parsl.load(config)
|
43
|
-
|
44
|
-
x = [platform() for i in range(10)]
|
45
|
-
print([i.result() for i in x])
|
46
|
-
|
47
|
-
|
48
|
-
if __name__ == "__main__":
|
49
|
-
test_raw_provider()
|
@@ -1,13 +0,0 @@
|
|
1
|
-
from parsl.channels import OAuthSSHChannel
|
2
|
-
|
3
|
-
|
4
|
-
def test_channel():
|
5
|
-
channel = OAuthSSHChannel(hostname='ssh.demo.globus.org', username='yadunand')
|
6
|
-
x, stdout, stderr = channel.execute_wait('ls')
|
7
|
-
print(x, stdout, stderr)
|
8
|
-
assert x == 0, "Expected exit code 0, got {}".format(x)
|
9
|
-
|
10
|
-
|
11
|
-
if __name__ == '__main__':
|
12
|
-
|
13
|
-
test_channel()
|
@@ -1,101 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.1
|
2
|
-
Name: parsl
|
3
|
-
Version: 2024.7.29
|
4
|
-
Summary: Simple data dependent workflows in Python
|
5
|
-
Home-page: https://github.com/Parsl/parsl
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2024.07.29.tar.gz
|
7
|
-
Author: The Parsl Team
|
8
|
-
Author-email: parsl@googlegroups.com
|
9
|
-
License: Apache 2.0
|
10
|
-
Keywords: Workflows,Scientific computing
|
11
|
-
Classifier: Development Status :: 5 - Production/Stable
|
12
|
-
Classifier: Intended Audience :: Developers
|
13
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
15
|
-
Classifier: Programming Language :: Python :: 3.9
|
16
|
-
Classifier: Programming Language :: Python :: 3.10
|
17
|
-
Classifier: Programming Language :: Python :: 3.11
|
18
|
-
Classifier: Programming Language :: Python :: 3.12
|
19
|
-
Requires-Python: >=3.8.0
|
20
|
-
License-File: LICENSE
|
21
|
-
Requires-Dist: pyzmq >=17.1.2
|
22
|
-
Requires-Dist: typeguard !=3.*,<5,>=2.10
|
23
|
-
Requires-Dist: typing-extensions <5,>=4.6
|
24
|
-
Requires-Dist: globus-sdk
|
25
|
-
Requires-Dist: dill
|
26
|
-
Requires-Dist: tblib
|
27
|
-
Requires-Dist: requests
|
28
|
-
Requires-Dist: paramiko
|
29
|
-
Requires-Dist: psutil >=5.5.1
|
30
|
-
Requires-Dist: setproctitle
|
31
|
-
Requires-Dist: filelock <4,>=3.13
|
32
|
-
Provides-Extra: all
|
33
|
-
Requires-Dist: sqlalchemy <2,>=1.4 ; extra == 'all'
|
34
|
-
Requires-Dist: pydot ; extra == 'all'
|
35
|
-
Requires-Dist: networkx <2.6,>=2.5 ; extra == 'all'
|
36
|
-
Requires-Dist: Flask >=1.0.2 ; extra == 'all'
|
37
|
-
Requires-Dist: flask-sqlalchemy ; extra == 'all'
|
38
|
-
Requires-Dist: pandas <2.2 ; extra == 'all'
|
39
|
-
Requires-Dist: plotly ; extra == 'all'
|
40
|
-
Requires-Dist: python-daemon ; extra == 'all'
|
41
|
-
Requires-Dist: boto3 ; extra == 'all'
|
42
|
-
Requires-Dist: kubernetes ; extra == 'all'
|
43
|
-
Requires-Dist: oauth-ssh >=0.9 ; extra == 'all'
|
44
|
-
Requires-Dist: ipython <=8.6.0 ; extra == 'all'
|
45
|
-
Requires-Dist: nbsphinx ; extra == 'all'
|
46
|
-
Requires-Dist: sphinx <7.2,>=7.1 ; extra == 'all'
|
47
|
-
Requires-Dist: sphinx-rtd-theme ; extra == 'all'
|
48
|
-
Requires-Dist: google-auth ; extra == 'all'
|
49
|
-
Requires-Dist: google-api-python-client ; extra == 'all'
|
50
|
-
Requires-Dist: python-gssapi ; extra == 'all'
|
51
|
-
Requires-Dist: azure <=4 ; extra == 'all'
|
52
|
-
Requires-Dist: msrestazure ; extra == 'all'
|
53
|
-
Requires-Dist: work-queue ; extra == 'all'
|
54
|
-
Requires-Dist: pyyaml ; extra == 'all'
|
55
|
-
Requires-Dist: cffi ; extra == 'all'
|
56
|
-
Requires-Dist: jsonschema ; extra == 'all'
|
57
|
-
Requires-Dist: proxystore ; extra == 'all'
|
58
|
-
Requires-Dist: radical.pilot ==1.60 ; extra == 'all'
|
59
|
-
Requires-Dist: radical.utils ==1.60 ; extra == 'all'
|
60
|
-
Provides-Extra: aws
|
61
|
-
Requires-Dist: boto3 ; extra == 'aws'
|
62
|
-
Provides-Extra: azure
|
63
|
-
Requires-Dist: azure <=4 ; extra == 'azure'
|
64
|
-
Requires-Dist: msrestazure ; extra == 'azure'
|
65
|
-
Provides-Extra: docs
|
66
|
-
Requires-Dist: ipython <=8.6.0 ; extra == 'docs'
|
67
|
-
Requires-Dist: nbsphinx ; extra == 'docs'
|
68
|
-
Requires-Dist: sphinx <7.2,>=7.1 ; extra == 'docs'
|
69
|
-
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
|
70
|
-
Provides-Extra: flux
|
71
|
-
Requires-Dist: pyyaml ; extra == 'flux'
|
72
|
-
Requires-Dist: cffi ; extra == 'flux'
|
73
|
-
Requires-Dist: jsonschema ; extra == 'flux'
|
74
|
-
Provides-Extra: google_cloud
|
75
|
-
Requires-Dist: google-auth ; extra == 'google_cloud'
|
76
|
-
Requires-Dist: google-api-python-client ; extra == 'google_cloud'
|
77
|
-
Provides-Extra: gssapi
|
78
|
-
Requires-Dist: python-gssapi ; extra == 'gssapi'
|
79
|
-
Provides-Extra: kubernetes
|
80
|
-
Requires-Dist: kubernetes ; extra == 'kubernetes'
|
81
|
-
Provides-Extra: monitoring
|
82
|
-
Requires-Dist: sqlalchemy <2,>=1.4 ; extra == 'monitoring'
|
83
|
-
Provides-Extra: oauth_ssh
|
84
|
-
Requires-Dist: oauth-ssh >=0.9 ; extra == 'oauth_ssh'
|
85
|
-
Provides-Extra: proxystore
|
86
|
-
Requires-Dist: proxystore ; extra == 'proxystore'
|
87
|
-
Provides-Extra: radical-pilot
|
88
|
-
Requires-Dist: radical.pilot ==1.60 ; extra == 'radical-pilot'
|
89
|
-
Requires-Dist: radical.utils ==1.60 ; extra == 'radical-pilot'
|
90
|
-
Provides-Extra: visualization
|
91
|
-
Requires-Dist: pydot ; extra == 'visualization'
|
92
|
-
Requires-Dist: networkx <2.6,>=2.5 ; extra == 'visualization'
|
93
|
-
Requires-Dist: Flask >=1.0.2 ; extra == 'visualization'
|
94
|
-
Requires-Dist: flask-sqlalchemy ; extra == 'visualization'
|
95
|
-
Requires-Dist: pandas <2.2 ; extra == 'visualization'
|
96
|
-
Requires-Dist: plotly ; extra == 'visualization'
|
97
|
-
Requires-Dist: python-daemon ; extra == 'visualization'
|
98
|
-
Provides-Extra: workqueue
|
99
|
-
Requires-Dist: work-queue ; extra == 'workqueue'
|
100
|
-
|
101
|
-
Simple parallel workflows system for Python
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|