equal
deleted
inserted
replaced
33 import time |
33 import time |
34 import traceback |
34 import traceback |
35 import warnings |
35 import warnings |
36 |
36 |
37 from typing import ( |
37 from typing import ( |
|
38 Any, |
38 Iterable, |
39 Iterable, |
39 Iterator, |
40 Iterator, |
40 List, |
41 List, |
41 Optional, |
42 Optional, |
42 Tuple, |
43 Tuple, |
1810 |
1811 |
1811 def never(fn): |
1812 def never(fn): |
1812 return False |
1813 return False |
1813 |
1814 |
1814 |
1815 |
1815 def nogc(func): |
1816 def nogc(func=None) -> Any: |
1816 """disable garbage collector |
1817 """disable garbage collector |
1817 |
1818 |
1818 Python's garbage collector triggers a GC each time a certain number of |
1819 Python's garbage collector triggers a GC each time a certain number of |
1819 container objects (the number being defined by gc.get_threshold()) are |
1820 container objects (the number being defined by gc.get_threshold()) are |
1820 allocated even when marked not to be tracked by the collector. Tracking has |
1821 allocated even when marked not to be tracked by the collector. Tracking has |
1823 containers. |
1824 containers. |
1824 |
1825 |
1825 This garbage collector issue have been fixed in 2.7. But it still affect |
1826 This garbage collector issue have been fixed in 2.7. But it still affect |
1826 CPython's performance. |
1827 CPython's performance. |
1827 """ |
1828 """ |
1828 |
1829 if func is None: |
|
1830 return _nogc_context() |
|
1831 else: |
|
1832 return _nogc_decorator(func) |
|
1833 |
|
1834 |
|
1835 @contextlib.contextmanager |
|
1836 def _nogc_context(): |
|
1837 gcenabled = gc.isenabled() |
|
1838 gc.disable() |
|
1839 try: |
|
1840 yield |
|
1841 finally: |
|
1842 if gcenabled: |
|
1843 gc.enable() |
|
1844 |
|
1845 |
|
1846 def _nogc_decorator(func): |
1829 def wrapper(*args, **kwargs): |
1847 def wrapper(*args, **kwargs): |
1830 gcenabled = gc.isenabled() |
1848 with _nogc_context(): |
1831 gc.disable() |
|
1832 try: |
|
1833 return func(*args, **kwargs) |
1849 return func(*args, **kwargs) |
1834 finally: |
|
1835 if gcenabled: |
|
1836 gc.enable() |
|
1837 |
1850 |
1838 return wrapper |
1851 return wrapper |
1839 |
1852 |
1840 |
1853 |
1841 if pycompat.ispypy: |
1854 if pycompat.ispypy: |