Source code for apstools.plans.run_blocking_function_plan

import logging

import bluesky.plan_stubs as bps

from ..utils import run_in_thread

logger = logging.getLogger(__name__)
POLL_DELAY = 0.000_05

[docs]def run_blocking_function(function, *args, **kwargs): """ Run a blocking function as a bluesky plan, in a thread. The ``run_blocking_function()`` is a bluesky plan which runs ``function(*args, **kwargs)`` in a thread so it does not block the RunEngine's background operations. .. note: Any result(s) returned from ``function`` will be ignored. It is intended to call blocking code that should not be called directly from a bluesky plan. USAGE:: yield from run_blocking_function(function, *args, **kwargs) EXAMPLE: This example creates a bluesky plan named ``start_incrementer()`` which configures a synApps "userCalc" as an automated 10Hz incrementer. Configuration is made by calling the *blocking* function :func:`~apstools.synApps.swait.setup_incrementer_swait`. The incrementer resets to zero at 100,000: .. code-block:: python from apstools.plans import run_blocking_function from apstools.synApps import SwaitRecord from apstools.synApps import setup_incrementer_swait import bluesky.plan_stubs as bps swait = SwaitRecord("ioc:userCalc1", name="swait") def start_incrementer(): yield from run_blocking_function( setup_incrementer_swait, swait, scan="0.1 second", limit=100_000 ) # now, run my_plan RE(my_plan()) .. note: This function is a convenience adapter to execute functions that are not bluesky generator functions, plans. It's best not to use this as a decorator. (new in release 1.6.3) """ @run_in_thread def internal(): result = function(*args, **kwargs) logger.debug("%s() result=%s", result) thread = internal() while thread.is_alive(): yield from bps.sleep(POLL_DELAY)
# ----------------------------------------------------------------------------- # :author: Pete R. Jemian # :email: # :copyright: (c) 2017-2024, UChicago Argonne, LLC # # Distributed under the terms of the Argonne National Laboratory Open Source License. # # The full license is in the file LICENSE.txt, distributed with this software. # -----------------------------------------------------------------------------