Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test child raises parent exits cleanly more reliable on macos #1335

51 changes: 14 additions & 37 deletions joblib/test/test_memmapping.py
Expand Up @@ -586,39 +586,6 @@ def parallel_raise(array, temp_dirs):
assert b"resource_tracker" not in err, err.decode()


@with_numpy
@with_multiprocessing
def test_nested_loop_error_in_grandchild_resource_tracker_silent():
# Safety smoke test: test that nested parallel calls using the loky backend
# don't yield noisy resource_tracker outputs when the grandchild errors
# out.
cmd = '''if 1:
from joblib import Parallel, delayed
def raise_error(i):
raise ValueError
def nested_loop(f):
Parallel(backend="loky", n_jobs=2)(
delayed(f)(i) for i in range(10)
)
if __name__ == "__main__":
Parallel(backend="loky", n_jobs=2)(
delayed(nested_loop)(func) for func in [raise_error]
)
'''
p = subprocess.Popen([sys.executable, '-c', cmd],
stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.wait()
out, err = p.communicate()
assert p.returncode == 1, out.decode()
assert b"resource_tracker" not in err, err.decode()


@with_numpy
@with_multiprocessing
@parametrize("backend", ["multiprocessing", "loky"])
Expand Down Expand Up @@ -813,6 +780,7 @@ def test_child_raises_parent_exits_cleanly(backend):
# - the resource_tracker does not emit any warnings.
cmd = """if 1:
import os
from pathlib import Path
from time import sleep
import numpy as np
Expand All @@ -824,9 +792,9 @@ def test_child_raises_parent_exits_cleanly(backend):
def get_temp_folder(parallel_obj, backend):
if "{b}" == "loky":
return p._backend._workers._temp_folder
return Path(p._backend._workers._temp_folder)
else:
return p._backend._pool._temp_folder
return Path(p._backend._pool._temp_folder)
if __name__ == "__main__":
Expand All @@ -839,13 +807,22 @@ def get_temp_folder(parallel_obj, backend):
# the temporary folder should be deleted by the end of this
# call but apparently on some file systems, this takes
# some time to be visible.
#
# We attempt to write into the temporary folder to test for
# its existence and we wait for a maximum of 10 seconds.
for i in range(100):
if not os.path.exists(temp_folder):
try:
with open(temp_folder / "some_file.txt", "w") as f:
f.write("some content")
except FileNotFoundError:
# temp_folder has been deleted, all is fine
break
# ... else, wait a bit and try again
sleep(.1)
else:
raise AssertionError(
temp_folder + " was not deleted"
str(temp_folder) + " was not deleted"
) from e
""".format(b=backend)
env = os.environ.copy()
Expand Down