Skip to content

Commit 7e669db

Browse files
committed
testing.CrossValidation & co.: use forkserver process start method on OS X
1 parent df83d17 commit 7e669db

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

Orange/evaluation/testing.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
import multiprocessing as mp
23
from itertools import product
34
from threading import Thread
@@ -313,6 +314,12 @@ def _mp_worker(train_data, test_data, test_i, fold_i, learner_i, learner, queue)
313314
return fold_i, learner_i, test_i, model, failed, predicted, probs
314315

315316

317+
def _mp_context():
318+
# Workaround for locks on Macintosh
319+
# https://pythonhosted.org/joblib/parallel.html#bad-interaction-of-multiprocessing-and-third-party-libraries
320+
return mp.get_context('forkserver' if sys.platform == 'darwin' else None)
321+
322+
316323
class CrossValidation(Results):
317324
"""
318325
K-fold cross validation.
@@ -380,7 +387,8 @@ def __init__(self, data, learners, k=10, random_state=0, store_data=False,
380387
# generators are concerned. I'm stumped.
381388
product(data_splits, enumerate(learners)))
382389

383-
with joblib.Parallel(n_jobs=n_jobs) as parallel:
390+
ctx = _mp_context()
391+
with joblib.Parallel(n_jobs=n_jobs, backend=ctx) as parallel:
384392
tasks = (joblib.delayed(_mp_worker)(*tup) for tup in args)
385393
thread = Thread(target=lambda: results.append(parallel(tasks)))
386394
thread.start()
@@ -445,7 +453,8 @@ def data_splits():
445453
for (fold_i, test_i, train, test) in data_splits()
446454
for (learner_i, learner) in enumerate(learners))
447455

448-
with joblib.Parallel(n_jobs=n_jobs) as parallel:
456+
ctx = _mp_context()
457+
with joblib.Parallel(n_jobs=n_jobs, backend=ctx) as parallel:
449458
tasks = (joblib.delayed(_mp_worker)(*tup) for tup in args)
450459
thread = Thread(target=lambda: results.append(parallel(tasks)))
451460
thread.start()
@@ -497,7 +506,8 @@ def data_splits():
497506
for (fold_i, test_i, train, test) in data_splits()
498507
for (learner_i, learner) in enumerate(learners))
499508

500-
with joblib.Parallel(n_jobs=n_jobs) as parallel:
509+
ctx = _mp_context()
510+
with joblib.Parallel(n_jobs=n_jobs, backend=ctx) as parallel:
501511
tasks = (joblib.delayed(_mp_worker)(*tup) for tup in args)
502512
thread = Thread(target=lambda: results.append(parallel(tasks)))
503513
thread.start()
@@ -564,7 +574,8 @@ def data_splits():
564574
for (fold_i, test_i, train, test), (learner_i, learner) in
565575
product(data_splits(), enumerate(learners)))
566576

567-
with joblib.Parallel(n_jobs=n_jobs) as parallel:
577+
ctx = _mp_context()
578+
with joblib.Parallel(n_jobs=n_jobs, backend=ctx) as parallel:
568579
tasks = (joblib.delayed(_mp_worker)(*tup) for tup in args)
569580
thread = Thread(target=lambda: results.append(parallel(tasks)))
570581
thread.start()
@@ -633,7 +644,8 @@ def data_splits():
633644
for (fold_i, test_i, train, test) in data_splits()
634645
for (learner_i, learner) in enumerate(learners))
635646

636-
with joblib.Parallel(n_jobs=n_jobs) as parallel:
647+
ctx = _mp_context()
648+
with joblib.Parallel(n_jobs=n_jobs, backend=ctx) as parallel:
637649
tasks = (joblib.delayed(_mp_worker)(*tup) for tup in args)
638650
thread = Thread(target=lambda: results.append(parallel(tasks)))
639651
thread.start()

0 commit comments

Comments
 (0)