webber

Webber: A Pythonic executor framework aimed at making parallel computing easy for everyone.

 1"""
 2Webber: A Pythonic executor framework aimed at making parallel computing easy for everyone.
 3"""
 4import sys as _sys
 5import logging as _logging
 6import threading as _threading
 7
 8__version__ = '0.3.0'
 9__supported__ = ("linux", "linux2", "win32")
10
11if _sys.platform not in __supported__:
12    _logging.warning(f"Webber {__version__} is only supported on these platforms: {', '.join(__supported__)}")
13
14from .core import DAG, Condition, QueueDAG
15from .xcoms import Promise
16
17# Event to signal when visualization libraries are ready (or failed gracefully)
18_viz_ready = _threading.Event()
19
20
21def _preload_viz() -> None:
22    """Background pre-import of visualization libraries to avoid circular imports."""
23    try:
24        import matplotlib
25        # Only set backend if pyplot hasn't been imported yet
26        if 'matplotlib.pyplot' not in _sys.modules:
27            matplotlib.use('Agg')
28        import matplotlib.pyplot
29        import netgraph
30    except (ImportError, AttributeError, Exception):
31        # Preload failed - visualization will import on demand instead
32        pass
33    finally:
34        # Signal ready regardless of success
35        _viz_ready.set()
36
37
38def wait_for_viz_ready(timeout: float = 5.0) -> bool:
39    """
40    Wait for visualization libraries to finish loading.
41
42    Called internally by visualization functions to avoid race conditions.
43    Does not block DAG execution - only affects visualize() calls.
44
45    Args:
46        timeout: Maximum seconds to wait (default 5.0)
47
48    Returns:
49        True if ready, False if timeout occurred
50    """
51    return _viz_ready.wait(timeout=timeout)
52
53
54# Start background import on module load (daemon thread won't block exit)
55_threading.Thread(target=_preload_viz, daemon=True, name='webber-viz-preload').start()
def wait_for_viz_ready(timeout: float = 5.0) -> bool:
39def wait_for_viz_ready(timeout: float = 5.0) -> bool:
40    """
41    Wait for visualization libraries to finish loading.
42
43    Called internally by visualization functions to avoid race conditions.
44    Does not block DAG execution - only affects visualize() calls.
45
46    Args:
47        timeout: Maximum seconds to wait (default 5.0)
48
49    Returns:
50        True if ready, False if timeout occurred
51    """
52    return _viz_ready.wait(timeout=timeout)

Wait for visualization libraries to finish loading.

Called internally by visualization functions to avoid race conditions. Does not block DAG execution - only affects visualize() calls.

Args: timeout: Maximum seconds to wait (default 5.0)

Returns: True if ready, False if timeout occurred