Skip to content

Commit b74ab09

Browse files
adds code to enable profiling of Celery tasks
* as a workaround for multiprocessing refusal to fork daemon processes, incorporates changes to allow importing of Process and Pipe from billiard, the Celery project's fork of the multiprocessing module if MEMPROF_PREFERS_BILLIARD envvar is set to true
1 parent e2a97b9 commit b74ab09

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

memory_profiler.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,38 @@
1818
import logging
1919
import traceback
2020
from signal import SIGKILL
21-
21+
import importlib
2222

2323
# TODO: provide alternative when multiprocessing is not available
24-
try:
25-
from multiprocessing import Process, Pipe
26-
except ImportError:
27-
from multiprocessing.dummy import Process, Pipe
24+
25+
# import Process and Pipe from a multiprocessing library in the following order:
26+
#
27+
# billiard - if and only if MEMPROF_PREFERS_BILLIARD envvar is set and true
28+
# multiprocessing
29+
# multiprocessing.dummy
30+
#
31+
MULTILIBS = (
32+
("billiard", (lambda: True if "MEMPROF_PREFERS_BILLIARD" in os.environ and
33+
os.environ["MEMPROF_PREFERS_BILLIARD"] in ["True", "true", "TRUE", "1"]
34+
else False)),
35+
("multiprocessing", None,),
36+
("multiprocessing.dummy", None,)
37+
)
38+
for module_tuple in MULTILIBS:
39+
multi_module_name, use_if_test = module_tuple
40+
try:
41+
multi_module = importlib.import_module(multi_module_name)
42+
except ImportError:
43+
if multi_module_name == "multiprocessing.dummy":
44+
raise
45+
continue
46+
if use_if_test is None or use_if_test():
47+
try:
48+
Process = multi_module.Process
49+
Pipe = multi_module.Pipe
50+
break
51+
except AttributeError:
52+
continue
2853

2954
try:
3055
from IPython.core.magic import Magics, line_cell_magic, magics_class

0 commit comments

Comments
 (0)