code: def get_app_and_locks():
      app = dash.Dash(__name__)
  
      app.layout = html.Div(
          [
              dcc.Input(id="input"),
              html.Button(["Blocking"], id="blocking"),
              html.Button(["Non Blocking"], id="non-blocking"),
              DataTable(
                  id="table",
                  columns=[{"name": i, "id": i} for i in rawDf.columns],
                  data=df,
                  editable=True,
                  filter_action="native",
                  fixed_columns={"headers": True},
                  fixed_rows={"headers": True},
                  page_action="native",
                  row_deletable=True,
                  row_selectable=True,
                  sort_action="native",
              ),
          ]
      )
  
      blocking_lock = Lock()
      non_blocking_lock = Lock()
  
      @app.callback(
          Output("table", "style_cell_conditional"),
          [Input("non-blocking", "n_clicks")],
      )
      def non_blocking_callback(clicks):
          if clicks is None:
              raise PreventUpdate
  
          with non_blocking_lock:
              return []
  
      @app.callback(
          Output("table", "data"), [Input("blocking", "n_clicks")]
      )
      def blocking_callback(clicks):
          if clicks is None:
              raise PreventUpdate
  
          with blocking_lock:
              return df
  
      return app, blocking_lock, non_blocking_lock
  
file_path: dash/components/dash-table/tests/selenium/test_editable.py
imports: import dash
  from dash import Input, Output, html, dcc
  from dash.exceptions import PreventUpdate
  from dash.dash_table import DataTable
  from multiprocessing import Lock
  from selenium.webdriver.common.keys import Keys
  import pandas
label_desc: Use image node_id 1 for calling a global function with example usage: get_app_and_locks() and returns: app,  blocking_lock,  non_blocking_lock, list, df