<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def initialize_ray():
 """Initializes ray based on environment variables and internal defaults."""

    if threading.current_thread().name == "MainThread":
        plasma_directory = None
        object_store_memory = os.environ.get("MODIN_MEMORY", None)
        if os.environ.get("MODIN_OUT_OF_CORE", "False").title() == "True":
            from tempfile import gettempdir

            plasma_directory = gettempdir()
            # We may have already set the memory from the environment variable, we don't
            # want to overwrite that value if we have.
            if object_store_memory is None:
                # Round down to the nearest Gigabyte.
                mem_bytes = ray.utils.get_system_memory() // 10 ** 9 * 10 ** 9
                # Default to 8x memory for out of core
                object_store_memory = 8 * mem_bytes
        # In case anything failed above, we can still improve the memory for Modin.
        if object_store_memory is None:
            # Round down to the nearest Gigabyte.
            object_store_memory = int(
                0.6 * ray.utils.get_system_memory() // 10 ** 9 * 10 ** 9
            )
            # If the memory pool is smaller than 2GB, just use the default in ray.
            if object_store_memory == 0:
                object_store_memory = None
        else:
            object_store_memory = int(object_store_memory)
        ray.init(
            include_webui=False,
            ignore_reinit_error=True,
            plasma_directory=plasma_directory,
            object_store_memory=object_store_memory,
        )
        # Register custom serializer for method objects to avoid warning message.
        # We serialize `MethodType` objects when we use AxisPartition operations.
        ray.register_custom_serializer(types.MethodType, use_pickle=True)