parsl 2025.9.8__py3-none-any.whl → 2025.9.15__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/curvezmq.py +0 -16
- parsl/executors/high_throughput/executor.py +8 -0
- parsl/executors/high_throughput/interchange.py +10 -1
- parsl/executors/high_throughput/zmq_pipes.py +29 -43
- parsl/monitoring/monitoring.py +2 -2
- parsl/multiprocessing.py +0 -49
- parsl/tests/test_curvezmq.py +0 -42
- parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
- parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
- parsl/tests/test_htex/test_priority_queue.py +1 -0
- parsl/tests/test_htex/test_zmq_binding.py +2 -1
- parsl/version.py +1 -1
- {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/interchange.py +10 -1
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/METADATA +2 -2
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/RECORD +22 -27
- parsl/tests/site_tests/test_provider.py +0 -88
- parsl/tests/site_tests/test_site.py +0 -70
- parsl/tests/test_aalst_patterns.py +0 -474
- parsl/tests/test_docs/test_workflow2.py +0 -42
- parsl/tests/test_error_handling/test_rand_fail.py +0 -171
- parsl/tests/test_regression/test_854.py +0 -62
- {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/exec_parsl_function.py +0 -0
- {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/parsl_coprocess.py +0 -0
- {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/process_worker_pool.py +0 -0
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/LICENSE +0 -0
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/WHEEL +0 -0
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/entry_points.txt +0 -0
- {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/top_level.txt +0 -0
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
import parsl
|
|
6
|
-
from parsl.app.app import python_app
|
|
7
|
-
from parsl.tests.configs.local_threads import fresh_config
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def local_config():
|
|
11
|
-
c = fresh_config()
|
|
12
|
-
c.retries = 2
|
|
13
|
-
return c
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@python_app
|
|
17
|
-
def sleep_fail(sleep_dur, sleep_rand_max, fail_prob, inputs=[]):
|
|
18
|
-
import random
|
|
19
|
-
import time
|
|
20
|
-
|
|
21
|
-
s = sleep_dur + random.randint(-sleep_rand_max, sleep_rand_max)
|
|
22
|
-
|
|
23
|
-
time.sleep(s)
|
|
24
|
-
x = float(random.randint(0, 100)) / 100
|
|
25
|
-
if x <= fail_prob:
|
|
26
|
-
# print("Fail")
|
|
27
|
-
raise Exception("App failure")
|
|
28
|
-
else:
|
|
29
|
-
pass
|
|
30
|
-
# print("Succeed")
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@python_app
|
|
34
|
-
def double(x):
|
|
35
|
-
return x * 2
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@pytest.mark.local
|
|
39
|
-
def test_simple(n=10):
|
|
40
|
-
import time
|
|
41
|
-
start = time.time()
|
|
42
|
-
x = double(n)
|
|
43
|
-
print("Result : ", x.result())
|
|
44
|
-
assert x.result() == n * \
|
|
45
|
-
2, "Expected double to return:{0} instead got:{1}".format(
|
|
46
|
-
n * 2, x.result())
|
|
47
|
-
print("Duration : {0}s".format(time.time() - start))
|
|
48
|
-
print("[TEST STATUS] test_parallel_for [SUCCESS]")
|
|
49
|
-
return True
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@pytest.mark.skip('broken')
|
|
53
|
-
def test_no_deps(numtasks=10):
|
|
54
|
-
"""Test basic error handling, with no dependent failures
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
fus = []
|
|
58
|
-
for i in range(0, 10):
|
|
59
|
-
|
|
60
|
-
fu = sleep_fail(0.1, 0, .8)
|
|
61
|
-
fus.extend([fu])
|
|
62
|
-
|
|
63
|
-
count = 0
|
|
64
|
-
for fu in fus:
|
|
65
|
-
try:
|
|
66
|
-
fu.result()
|
|
67
|
-
except Exception as e:
|
|
68
|
-
print("Caught exception : ", "*" * 20)
|
|
69
|
-
print(e)
|
|
70
|
-
print("*" * 20)
|
|
71
|
-
count += 1
|
|
72
|
-
|
|
73
|
-
print("Caught failures of {0}/{1}".format(count, len(fus)))
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@pytest.mark.skip('broken')
|
|
77
|
-
def test_fail_sequence(numtasks=10):
|
|
78
|
-
"""Test failure in a sequence of dependencies
|
|
79
|
-
|
|
80
|
-
App1 -> App2 ... -> AppN
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
sleep_dur = 0.1
|
|
84
|
-
fail_prob = 0.4
|
|
85
|
-
|
|
86
|
-
fus = {0: None}
|
|
87
|
-
for i in range(0, numtasks):
|
|
88
|
-
print("Chaining {0} to {1}".format(i + 1, fus[i]))
|
|
89
|
-
fus[i + 1] = sleep_fail(sleep_dur, 0, fail_prob, inputs=[fus[i]])
|
|
90
|
-
|
|
91
|
-
# time.sleep(numtasks*sleep_dur)
|
|
92
|
-
for k in sorted(fus.keys()):
|
|
93
|
-
try:
|
|
94
|
-
x = fus[i].result()
|
|
95
|
-
print("{0} : {1}".format(k, x))
|
|
96
|
-
except Exception as e:
|
|
97
|
-
print("{0} : {1}".format(k, e))
|
|
98
|
-
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
@pytest.mark.skip('broken')
|
|
103
|
-
def test_deps(numtasks=10):
|
|
104
|
-
"""Random failures in branches of Map -> Map -> reduce
|
|
105
|
-
|
|
106
|
-
App1 App2 ... AppN
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
fus = []
|
|
110
|
-
for i in range(0, numtasks):
|
|
111
|
-
fu = sleep_fail(0.2, 0, .4)
|
|
112
|
-
fus.extend([fu])
|
|
113
|
-
|
|
114
|
-
# App1 App2 ... AppN
|
|
115
|
-
# | | |
|
|
116
|
-
# V V V
|
|
117
|
-
# App1 App2 ... AppN
|
|
118
|
-
|
|
119
|
-
fus_2 = []
|
|
120
|
-
for fu in fus:
|
|
121
|
-
fu = sleep_fail(0, 0, .8, inputs=[fu])
|
|
122
|
-
fus_2.extend([fu])
|
|
123
|
-
|
|
124
|
-
# App1 App2 ... AppN
|
|
125
|
-
# | | |
|
|
126
|
-
# V V V
|
|
127
|
-
# App1 App2 ... AppN
|
|
128
|
-
# \ | /
|
|
129
|
-
# \ | /
|
|
130
|
-
# App_Final
|
|
131
|
-
|
|
132
|
-
fu_final = sleep_fail(1, 0, 0, inputs=fus_2)
|
|
133
|
-
|
|
134
|
-
try:
|
|
135
|
-
print("Final status : ", fu_final.result())
|
|
136
|
-
except parsl.dataflow.errors.DependencyError as e:
|
|
137
|
-
print("Caught the right exception")
|
|
138
|
-
print("Exception : ", e)
|
|
139
|
-
except Exception as e:
|
|
140
|
-
assert 5 == 1, "Expected DependencyError got : %s" % e
|
|
141
|
-
else:
|
|
142
|
-
print("Shoot! no errors ")
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
@python_app
|
|
146
|
-
def sleep_then_fail(sleep_dur=0.1):
|
|
147
|
-
import math
|
|
148
|
-
import time
|
|
149
|
-
time.sleep(sleep_dur)
|
|
150
|
-
math.ceil("Trigger TypeError")
|
|
151
|
-
return 0
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
@pytest.mark.skip('broken')
|
|
155
|
-
def test_fail_nowait(numtasks=10):
|
|
156
|
-
"""Test basic error handling, with no dependent failures
|
|
157
|
-
"""
|
|
158
|
-
import time
|
|
159
|
-
fus = []
|
|
160
|
-
for i in range(0, numtasks):
|
|
161
|
-
fu = sleep_then_fail(sleep_dur=0.1)
|
|
162
|
-
fus.extend([fu])
|
|
163
|
-
|
|
164
|
-
try:
|
|
165
|
-
[x.result() for x in fus]
|
|
166
|
-
except Exception as e:
|
|
167
|
-
assert isinstance(e, TypeError), "Expected a TypeError, got {}".format(e)
|
|
168
|
-
|
|
169
|
-
# fus[0].result()
|
|
170
|
-
time.sleep(1)
|
|
171
|
-
print("Done")
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import multiprocessing
|
|
2
|
-
import random
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
import pytest
|
|
6
|
-
|
|
7
|
-
from parsl.multiprocessing import MacSafeQueue
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def consumer(in_q, out_q, delay=0):
|
|
11
|
-
while True:
|
|
12
|
-
x = in_q.get()
|
|
13
|
-
time.sleep(delay)
|
|
14
|
-
if x == 'STOP':
|
|
15
|
-
out_q.put('STOPPED')
|
|
16
|
-
break
|
|
17
|
-
else:
|
|
18
|
-
out_q.put(x)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@pytest.mark.local
|
|
22
|
-
def test_mac_safe_queue():
|
|
23
|
-
""" Regression test for HTEX being broken on Mac OS: https://github.com/Parsl/parsl/issues/854
|
|
24
|
-
This test doesn't test the fix on mac's however it tests a multiprocessing queue replacement
|
|
25
|
-
that is safe to run on Mac OS.
|
|
26
|
-
"""
|
|
27
|
-
task_q = MacSafeQueue()
|
|
28
|
-
result_q = MacSafeQueue()
|
|
29
|
-
|
|
30
|
-
p = multiprocessing.Process(target=consumer, args=(task_q, result_q,))
|
|
31
|
-
p.start()
|
|
32
|
-
for i in range(10):
|
|
33
|
-
task_q.put(i)
|
|
34
|
-
result_q.get()
|
|
35
|
-
task_q.put('STOP')
|
|
36
|
-
r = result_q.get()
|
|
37
|
-
assert r == 'STOPPED', "Did not get stopped confirmation, got:{}".format(r)
|
|
38
|
-
p.terminate()
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@pytest.mark.local
|
|
42
|
-
def test_mac_safe_queue_size():
|
|
43
|
-
""" Regression test for HTEX being broken on Mac OS: https://github.com/Parsl/parsl/issues/854
|
|
44
|
-
This test doesn't test the fix on mac's however it tests a multiprocessing queue replacement
|
|
45
|
-
that is safe to run on Mac OS.
|
|
46
|
-
"""
|
|
47
|
-
task_q = MacSafeQueue()
|
|
48
|
-
result_q = MacSafeQueue()
|
|
49
|
-
|
|
50
|
-
x = random.randint(1, 100)
|
|
51
|
-
|
|
52
|
-
[task_q.put(i) for i in range(x)]
|
|
53
|
-
assert task_q.empty() is False, "Task queue should not be empty"
|
|
54
|
-
assert task_q.qsize() == x, "Task queue should be {}; instead got {}".format(x, task_q.qsize())
|
|
55
|
-
|
|
56
|
-
p = multiprocessing.Process(target=consumer, args=(task_q, result_q,))
|
|
57
|
-
p.start()
|
|
58
|
-
task_q.put('STOP')
|
|
59
|
-
p.join()
|
|
60
|
-
assert result_q.empty() is False, "Result queue should not be empty"
|
|
61
|
-
qlen = result_q.qsize()
|
|
62
|
-
assert qlen == x + 1, "Result queue should be {}; instead got {}".format(x + 1, qlen)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|