diff --git a/freqtrade/main.py b/freqtrade/main.py index fd142452a..6720e5eeb 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -18,7 +18,12 @@ from freqtrade.commands import Arguments from freqtrade.constants import DOCS_LINK from freqtrade.exceptions import ConfigurationError, FreqtradeException, OperationalException from freqtrade.loggers import setup_logging_pre -from freqtrade.system import asyncio_setup, gc_set_threshold, print_version_info +from freqtrade.system import ( + asyncio_setup, + gc_set_threshold, + print_version_info, + set_mp_start_method, +) logger = logging.getLogger("freqtrade") @@ -44,6 +49,7 @@ def main(sysargv: list[str] | None = None) -> None: elif "func" in args: logger.info(f"freqtrade {__version__}") gc_set_threshold() + set_mp_start_method() return_code = args["func"](args) else: # No subcommand was issued. diff --git a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py index 91703b6c1..f1b3f7cdd 100644 --- a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py +++ b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py @@ -7,7 +7,7 @@ import logging import sys import warnings from datetime import UTC, datetime -from multiprocessing import Manager, get_all_start_methods, set_start_method +from multiprocessing import Manager from pathlib import Path from typing import Any @@ -125,12 +125,6 @@ class HyperOptimizer: local_queue must be a global and passed to the child process via inheritance. """ global log_queue - try: - sms = get_all_start_methods() - if "forkserver" in sms: - set_start_method("forkserver") - except RuntimeError: - pass # start method has already been set m = Manager() log_queue = m.Queue() logger.info(f"manager queue {type(log_queue)}") diff --git a/freqtrade/system/__init__.py b/freqtrade/system/__init__.py index e69e90de8..9bb472d01 100644 --- a/freqtrade/system/__init__.py +++ b/freqtrade/system/__init__.py @@ -2,7 +2,8 @@ from freqtrade.system.asyncio_config import asyncio_setup from freqtrade.system.gc_setup import gc_set_threshold +from freqtrade.system.set_mp_start_method import set_mp_start_method from freqtrade.system.version_info import print_version_info -__all__ = ["asyncio_setup", "gc_set_threshold", "print_version_info"] +__all__ = ["asyncio_setup", "gc_set_threshold", "print_version_info", "set_mp_start_method"] diff --git a/freqtrade/system/set_mp_start_method.py b/freqtrade/system/set_mp_start_method.py new file mode 100644 index 000000000..34b7051c5 --- /dev/null +++ b/freqtrade/system/set_mp_start_method.py @@ -0,0 +1,14 @@ +from multiprocessing import get_all_start_methods, get_start_method, set_start_method + + +def set_mp_start_method(): + """ + Set multiprocessing start method to not be fork. + forkserver will become the default in 3.14 - and is deprecated in 3.13 + """ + try: + sms = get_all_start_methods() + if "forkserver" in sms and get_start_method(True) is None: + set_start_method("forkserver") + except RuntimeError: + pass