| <!doctype html><html lang=en dir=ltr class="docs-wrapper plugin-docs plugin-id-developer_docs docs-version-current docs-doc-page docs-doc-id-extensions/tasks" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.1"><title data-rh=true>Tasks | Superset</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:url content=https://superset.apache.org/developer-docs/extensions/tasks /><meta data-rh=true property=og:locale content=en /><meta data-rh=true name=docusaurus_locale content=en /><meta data-rh=true name=docsearch:language content=en /><meta data-rh=true name=keywords content="data visualization, business intelligence, BI, dashboards, SQL, analytics, open source, Apache, charts, reporting"/><meta data-rh=true property=og:type content=website /><meta data-rh=true property=og:site_name content="Apache Superset"/><meta data-rh=true property=og:image content=https://superset.apache.org/img/superset-og-image.png /><meta data-rh=true property=og:image:width content=1200 /><meta data-rh=true property=og:image:height content=630 /><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=twitter:image content=https://superset.apache.org/img/superset-og-image.png /><meta data-rh=true name=twitter:site content=@ApacheSuperset /><meta data-rh=true name=docusaurus_version content=current /><meta data-rh=true name=docusaurus_tag content=docs-developer_docs-current /><meta data-rh=true name=docsearch:version content=current /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-developer_docs-current /><meta data-rh=true property=og:title content="Tasks | Superset"/><meta data-rh=true name=description content="<!--"/><meta data-rh=true property=og:description content="<!--"/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://superset.apache.org/developer-docs/extensions/tasks /><link data-rh=true rel=alternate href=https://superset.apache.org/developer-docs/extensions/tasks hreflang=en /><link data-rh=true rel=alternate href=https://superset.apache.org/developer-docs/extensions/tasks hreflang=x-default /><link data-rh=true rel=preconnect href=https://WR5FASX5ED-dsn.algolia.net crossorigin=anonymous /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://superset.apache.org/developer-docs/extensions/tasks","name":"Tasks","position":1}]}</script><link rel=search type=application/opensearchdescription+xml title=Superset href=/opensearch.xml><script type=application/ld+json>{"@context":"https://schema.org","@type":"SoftwareApplication","applicationCategory":"BusinessApplication","author":{"@type":"Organization","logo":"https://www.apache.org/foundation/press/kit/asf_logo.png","name":"Apache Software Foundation","url":"https://www.apache.org/"},"description":"Apache Superset is a modern, enterprise-ready business intelligence web application for data exploration and visualization.","featureList":["Interactive dashboards","SQL IDE","40+ visualization types","Semantic layer","Role-based access control","REST API"],"license":"https://www.apache.org/licenses/LICENSE-2.0","name":"Apache Superset","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"operatingSystem":"Cross-platform","url":"https://superset.apache.org"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"WebSite","name":"Apache Superset","potentialAction":{"@type":"SearchAction","query-input":"required name=search_term_string","target":{"@type":"EntryPoint","urlTemplate":"https://superset.apache.org/search?q={search_term_string}"}},"url":"https://superset.apache.org"}</script><link rel=preconnect href=https://WR5FASX5ED-dsn.algolia.net crossorigin=anonymous><link rel=preconnect href=https://analytics.apache.org><script src=https://widget.kapa.ai/kapa-widget.bundle.js async data-website-id=c6a8a8b8-3127-48f9-97a7-51e9e10d20d0 data-project-name="Apache Superset" data-project-color=#FFFFFF data-project-logo=https://superset.apache.org/img/superset-logo-icon-only.png data-modal-override-open-id=ask-ai-input data-modal-override-open-class=search-input data-modal-disclaimer="This is a custom LLM for Apache Superset with access to all [documentation](superset.apache.org/docs/intro/), [GitHub Open Issues, PRs and READMEs](github.com/apache/superset).&#10;&#10;Companies deploy assistants like this ([built by kapa.ai](https://kapa.ai)) on docs via [website widget](https://docs.kapa.ai/integrations/website-widget) (Docker, Reddit), in [support forms](https://docs.kapa.ai/integrations/support-form-deflector) for ticket deflection (Monday.com, Mapbox), or as [Slack bots](https://docs.kapa.ai/integrations/slack-bot) with private sources." data-modal-example-questions="How do I install Superset?,How can I contribute to Superset?" data-button-text-color=rgb(81,166,197) data-modal-header-bg-color=#ffffff data-modal-title-color=rgb(81,166,197) data-modal-title="Apache Superset AI" data-modal-disclaimer-text-color=#000000 data-consent-required=true data-consent-screen-disclaimer="By clicking "I agree, let's chat", you consent to the use of the AI assistant in accordance with kapa.ai's [Privacy Policy](https://www.kapa.ai/content/privacy-policy). This service uses reCAPTCHA, which requires your consent to Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms). By proceeding, you explicitly agree to both kapa.ai's and Google's privacy policies."></script><link rel=stylesheet href=/assets/css/styles.c802b717.css /><script src=/assets/js/runtime~main.d3cd9308.js defer></script><script src=/assets/js/main.198cbbee.js defer></script></head><body><svg style="display: none;"><defs> |
| <symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> |
| </defs></svg> |
| <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class=navbar__brand href=/><div class=navbar__logo><img src=/img/superset-logo-horiz.svg alt="Superset Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/superset-logo-horiz-dark.svg alt="Superset Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div></a><div class="navbar__item dropdown dropdown--hoverable"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/user-docs/>Users</a><ul class=dropdown__menu><li><a class=dropdown__link href=/user-docs/>Overview</a><li><a class=dropdown__link href=/user-docs/quickstart>Quickstart</a><li><a class=dropdown__link href=/user-docs/using-superset/creating-your-first-dashboard>Using Superset</a><li><a class=dropdown__link href=/user-docs/databases/>Connecting to Databases</a><li><a class=dropdown__link href=/user-docs/faq>FAQ</a></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/admin-docs/>Admins</a><ul class=dropdown__menu><li><a class=dropdown__link href=/admin-docs/>Overview</a><li><a class=dropdown__link href=/admin-docs/installation/installation-methods>Installation</a><li><a class=dropdown__link href=/admin-docs/configuration/configuring-superset>Configuration</a><li><a class=dropdown__link href=/user-docs/databases/>Database Drivers</a><li><a class=dropdown__link href=/admin-docs/security/>Security</a></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a aria-current=page class="navbar__link active" aria-haspopup=true aria-expanded=false role=button href=/developer-docs/>Developers</a><ul class=dropdown__menu><li><a class=dropdown__link href=/developer-docs/>Overview</a><li><a class=dropdown__link href=/developer-docs/contributing/overview>Contributing</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/developer-docs/extensions/overview>Extensions</a><li><a class=dropdown__link href=/developer-docs/testing/overview>Testing</a><li><a class=dropdown__link href=/developer-docs/components/>UI Components</a><li><a class=dropdown__link href=/developer-docs/api>API Reference</a></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/community>Community</a><ul class=dropdown__menu><li><a class=dropdown__link href=/community>Resources</a><li><a href=https://github.com/apache/superset target=_blank rel="noopener noreferrer" class=dropdown__link>GitHub<svg width=12 height=12 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li><a href=http://bit.ly/join-superset-slack target=_blank rel="noopener noreferrer" class=dropdown__link>Slack<svg width=12 height=12 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li><a href=https://lists.apache.org/list.html?dev@superset.apache.org target=_blank rel="noopener noreferrer" class=dropdown__link>Mailing List<svg width=12 height=12 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li><a href=https://stackoverflow.com/questions/tagged/apache-superset target=_blank rel="noopener noreferrer" class=dropdown__link>Stack Overflow<svg width=12 height=12 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li><a class=dropdown__link href=/community#superset-community-calendar>Community Calendar</a><li><a class=dropdown__link href=/inTheWild>In the Wild</a></ul></div></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><style data-emotion="css kad2tq">.css-kad2tq{z-index:2;border-radius:10px;align-items:stretch;width:176px;margin-right:20px;font-size:18px;font-weight:700;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;overflow:hidden}.css-kad2tq .split-main{color:#fff;-webkit-flex:1;-ms-flex:1;flex:1;justify-content:center;align-items:center;min-width:0;padding:7px 8px;-webkit-text-decoration:none;text-decoration:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.css-kad2tq .split-main:hover{color:#fff}.css-kad2tq .split-divider{background:#ffffff61;-ms-flex-negative:0;-webkit-flex-shrink:0;flex-shrink:0;align-self:stretch;width:1px;margin:6px 0}.css-kad2tq .split-dropdown-trigger{cursor:pointer;color:#fff;background:0 0;border:none;-ms-flex-negative:0;-webkit-flex-shrink:0;flex-shrink:0;justify-content:center;align-items:center;width:38px;margin:0;padding:0;font-size:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.css-kad2tq .split-dropdown-trigger:hover{color:#fff}</style><div class="default-button-theme get-started-split get-started-button css-kad2tq"><a class=split-main href=/user-docs/>Get Started</a><span class=split-divider aria-hidden=true></span><button type=button class="ant-dropdown-trigger split-dropdown-trigger" aria-haspopup=menu aria-label="Choose documentation: Users, Admins, or Developers"><span role=img aria-label=down class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable=false data-icon=down width=1em height=1em fill=currentColor aria-hidden=true><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"/></svg></span></button></div><a href=https://github.com/apache/superset target=_blank rel="noopener noreferrer" class="navbar__item navbar__link github-button"></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1><button type=button class="DocSearch DocSearch-Button" aria-label="Search (Meta+k)" aria-keyshortcuts=Meta+k><span class=DocSearch-Button-Container><svg width=20 height=20 class=DocSearch-Search-Icon viewBox="0 0 24 24" aria-hidden=true><circle cx=11 cy=11 r=8 stroke=currentColor fill=none stroke-width=1.4 /><path d="m21 21-4.3-4.3" stroke=currentColor fill=none stroke-linecap=round stroke-linejoin=round /></svg><span class=DocSearch-Button-Placeholder>Search</span></span><span class=DocSearch-Button-Keys></span></button></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class=menu__link href=/developer-docs/><span title=Overview class=linkLabel_WmDU>Overview</span></a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/developer-docs/contributing/overview><span title=Contributing class=categoryLinkLabel_W154>Contributing</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true href=/developer-docs/extensions/overview><span title=Extensions class=categoryLinkLabel_W154>Extensions</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/overview><span title=Overview class=linkLabel_WmDU>Overview</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/quick-start><span title="Quick Start" class=linkLabel_WmDU>Quick Start</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/architecture><span title=Architecture class=linkLabel_WmDU>Architecture</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/dependencies><span title=Dependencies class=linkLabel_WmDU>Dependencies</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/contribution-types><span title="Contribution Types" class=linkLabel_WmDU>Contribution Types</span></a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/developer-docs/extensions/extension-points/sqllab><span title="Extension Points" class=categoryLinkLabel_W154>Extension Points</span></a></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/development><span title=Development class=linkLabel_WmDU>Development</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/deployment><span title=Deployment class=linkLabel_WmDU>Deployment</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/mcp><span title="MCP Integration" class=linkLabel_WmDU>MCP Integration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/security><span title=Security class=linkLabel_WmDU>Security</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/developer-docs/extensions/tasks><span title=Tasks class=linkLabel_WmDU>Tasks</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/developer-docs/extensions/registry><span title="Community Extensions" class=linkLabel_WmDU>Community Extensions</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/developer-docs/testing/overview><span title=Testing class=categoryLinkLabel_W154>Testing</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/developer-docs/components/><span title="UI Components" class=categoryLinkLabel_W154>UI Components</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/developer-docs/api><span title="API Reference" class=categoryLinkLabel_W154>API Reference</span></a><button aria-label="Expand sidebar category 'API Reference'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></ul></nav><button type=button title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width=20 height=20 aria-hidden=true class=collapseSidebarButtonIcon_kv0_><g fill=#7a7a7a><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"/><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"/></g></svg></button></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_xLCN"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role=alert><div>This is unreleased documentation for <!-- -->Superset<!-- --> <b>Next</b> version.</div><div class=margin-top--md>For up-to-date documentation, see the <b><a href=/developer-docs/extensions/tasks>latest version</a></b> (<!-- -->Next<!-- -->).</div></div><div class=docItemContainer_jfFK><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Extensions</span><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Tasks</span></ul></nav><span class=versionBadge_QOso>Version:<!-- --> <a class="ant-dropdown-trigger versionSelector_oOvN">Next<!-- --> <span role=img aria-label=down class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable=false data-icon=down width=1em height=1em fill=currentColor aria-hidden=true><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"/></svg></span></a></span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><div class=row><div class="col col--12 markdown"><header><h1>Global Task Framework</h1></header> |
| <p>The Global Task Framework (GTF) provides a unified way to manage background tasks. It handles task execution, progress tracking, cancellation, and deduplication for both synchronous and asynchronous execution. The framework uses distributed locking internally to ensure race-free operations—you don't need to worry about concurrent task creation or cancellation conflicts.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=enabling-gtf>Enabling GTF<a href=#enabling-gtf class=hash-link aria-label="Direct link to Enabling GTF" title="Direct link to Enabling GTF" translate=no></a></h2> |
| <p>GTF is disabled by default and must be enabled via the <code>GLOBAL_TASK_FRAMEWORK</code> feature flag in your <code>superset_config.py</code>:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token plain">FEATURE_FLAGS </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"GLOBAL_TASK_FRAMEWORK"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br/></div></code></pre></div></div> |
| <p>When GTF is disabled:</p> |
| <ul> |
| <li class="">The Task List UI menu item is hidden</li> |
| <li class="">The <code>/api/v1/task/*</code> endpoints return 404</li> |
| <li class="">Calling or scheduling a <code>@task</code>-decorated function raises <code>GlobalTaskFrameworkDisabledError</code></li> |
| </ul> |
| <div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 14 16"><path fill-rule=evenodd d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"/></svg></span>Future Migration</div><div class=admonitionContent_BuS1><p>When GTF is considered stable, it will replace legacy Celery tasks for built-in features like thumbnails and alerts & reports. Enabling this flag prepares your deployment for that migration.</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=quick-start>Quick Start<a href=#quick-start class=hash-link aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate=no></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=define-a-task>Define a Task<a href=#define-a-task class=hash-link aria-label="Direct link to Define a Task" title="Direct link to Define a Task" translate=no></a></h3> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">decorators </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> get_context</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">process_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get_context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_cleanup</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">cleanup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> logger</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Processing complete"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> fetch_dataset</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> process_and_cache</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=execute-a-task>Execute a Task<a href=#execute-a-task class=hash-link aria-label="Direct link to Execute a Task" title="Direct link to Execute a Task" translate=no></a></h3> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token comment" style="color:rgb(106, 153, 85)"># Async execution - schedules on Celery worker</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> process_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">123</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">status</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># "pending"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Sync execution - runs inline in current process</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> process_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">123</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># ... blocks until complete</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">status</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># "success"</span><br/></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=async-vs-sync-execution>Async vs Sync Execution<a href=#async-vs-sync-execution class=hash-link aria-label="Direct link to Async vs Sync Execution" title="Direct link to Async vs Sync Execution" translate=no></a></h3> |
| <table><thead><tr><th>Method<th>When to Use<tbody><tr><td><code>.schedule()</code><td>Long-running operations, background processing, when you need to return immediately<tr><td>Direct call<td>Short operations, when deduplication matters, when you need the result before responding</table> |
| <p>Both execution modes provide the same task features: deduplication, progress tracking, cancellation, and visibility in the Task List UI. The difference is whether execution happens in a Celery worker (async) or inline (sync).</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=task-lifecycle>Task Lifecycle<a href=#task-lifecycle class=hash-link aria-label="Direct link to Task Lifecycle" title="Direct link to Task Lifecycle" translate=no></a></h2> |
| <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token plain">PENDING ──→ IN_PROGRESS ────→ SUCCESS</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ │</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ ├──────────→ FAILURE</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ ↓ ↑</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ ABORTING ────────────┘</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ │</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ ├──────────→ TIMED_OUT (timeout)</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> │ │</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> └─────────────┴──────────→ ABORTED (user cancel)</span><br/></div></code></pre></div></div> |
| <table><thead><tr><th>Status<th>Description<tbody><tr><td><code>PENDING</code><td>Queued, awaiting execution<tr><td><code>IN_PROGRESS</code><td>Executing<tr><td><code>ABORTING</code><td>Abort/timeout triggered, abort handlers running<tr><td><code>SUCCESS</code><td>Completed successfully<tr><td><code>FAILURE</code><td>Failed with error or abort/cleanup handler exception<tr><td><code>ABORTED</code><td>Cancelled by user/admin<tr><td><code>TIMED_OUT</code><td>Exceeded configured timeout</table> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=context-api>Context API<a href=#context-api class=hash-link aria-label="Direct link to Context API" title="Direct link to Context API" translate=no></a></h2> |
| <p>Access task context via <code>get_context()</code> from within any <code>@task</code> function. The context provides methods for updating task metadata and registering handlers.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=updating-task-metadata>Updating Task Metadata<a href=#updating-task-metadata class=hash-link aria-label="Direct link to Updating Task Metadata" title="Direct link to Updating Task Metadata" translate=no></a></h3> |
| <p>Use <code>update_task()</code> to report progress and store custom payload data:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">list</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get_context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> item </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">enumerate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> result </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">update_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> progress</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">len</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> payload</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string" style="color:rgb(206, 145, 120)">"last_result"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> result</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Call <code>update_task()</code> once per iteration for best performance. Frequent DB writes are throttled to limit metastore load, so batching progress and payload updates together in a single call ensures both are persisted at the same time.</div></div> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=progress-formats>Progress Formats<a href=#progress-formats class=hash-link aria-label="Direct link to Progress Formats" title="Direct link to Progress Formats" translate=no></a></h4> |
| <p>The <code>progress</code> parameter accepts three formats:</p> |
| <table><thead><tr><th>Format<th>Example<th>Display<tbody><tr><td><code>tuple[int, int]</code><td><code>progress=(3, 100)</code><td>3 of 100 (3%) with ETA<tr><td><code>float</code> (0.0-1.0)<td><code>progress=0.5</code><td>50% with ETA<tr><td><code>int</code><td><code>progress=42</code><td>42 processed</table> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Use the tuple format <code>(current, total)</code> whenever possible. It provides the richest information to users: showing both the count and percentage, while still computing ETA automatically.</div></div> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=payload>Payload<a href=#payload class=hash-link aria-label="Direct link to Payload" title="Direct link to Payload" translate=no></a></h4> |
| <p>The <code>payload</code> parameter stores custom metadata that can help users understand what the task is doing. Each call to <code>update_task()</code> replaces the previous payload completely.</p> |
| <p>In the Task List UI, when a payload is defined, an info icon appears in the <strong>Details</strong> column. Users can hover over it to see the JSON content.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=handlers>Handlers<a href=#handlers class=hash-link aria-label="Direct link to Handlers" title="Direct link to Handlers" translate=no></a></h3> |
| <p>Register handlers to run cleanup logic or respond to abort requests:</p> |
| <table><thead><tr><th>Handler<th>When it runs<th>Use case<tbody><tr><td><code>on_cleanup</code><td>Always (success, failure, abort)<td>Release resources, close connections<tr><td><code>on_abort</code><td>When task is aborted<td>Set stop flag, cancel external operations</table> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get_context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_cleanup</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">cleanup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> logger</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Task ended, cleaning up"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_abort</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">handle_abort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> logger</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Abort requested"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># ... task logic</span><br/></div></code></pre></div></div> |
| <p>Multiple handlers of the same type execute in LIFO order (last registered runs first). Abort handlers run first when abort is detected, then cleanup handlers run when the task ends.</p> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=best-effort-execution>Best-Effort Execution<a href=#best-effort-execution class=hash-link aria-label="Direct link to Best-Effort Execution" title="Direct link to Best-Effort Execution" translate=no></a></h4> |
| <p><strong>All registered handlers will always be attempted, even if one fails.</strong> This ensures that a failure in one handler doesn't prevent other handlers from running their cleanup logic.</p> |
| <p>For example, if you have three cleanup handlers and the second one throws an exception:</p> |
| <ol> |
| <li class="">Handler 3 runs ✓</li> |
| <li class="">Handler 2 throws an exception ✗ (logged, but execution continues)</li> |
| <li class="">Handler 1 runs ✓</li> |
| </ol> |
| <p>If any handler fails, the task is marked as <code>FAILURE</code> with combined error details showing all handler failures.</p> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Write handlers to be independent and self-contained. Don't assume previous handlers succeeded, and don't rely on shared state between handlers.</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=making-tasks-abortable>Making Tasks Abortable<a href=#making-tasks-abortable class=hash-link aria-label="Direct link to Making Tasks Abortable" title="Direct link to Making Tasks Abortable" translate=no></a></h2> |
| <p>When users click <strong>Cancel</strong> in the Task List, the system decides whether to <strong>abort</strong> (stop) the task or <strong>unsubscribe</strong> (remove the user from a shared task). Abort occurs when:</p> |
| <ul> |
| <li class="">It's a private or system task</li> |
| <li class="">It's a shared task and the user is the last subscriber</li> |
| <li class="">An admin checks <strong>Force abort</strong> to stop the task for all subscribers</li> |
| </ul> |
| <p>Pending tasks can always be aborted: they simply won't start. In-progress tasks require an abort handler to be abortable:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">abortable_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">list</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get_context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> should_stop </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">False</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_abort</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">handle_abort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">nonlocal</span><span class="token plain"> should_stop</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> should_stop </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> logger</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Abort signal received"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_cleanup</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">cleanup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> logger</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">info</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Task ended, cleaning up"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> item </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> items</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> should_stop</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Exit gracefully</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <p><strong>Key points:</strong></p> |
| <ul> |
| <li class="">Registering <code>on_abort</code> marks the task as abortable and starts the abort listener</li> |
| <li class="">The abort handler fires automatically when abort is triggered</li> |
| <li class="">Use a flag pattern to gracefully stop processing at safe points</li> |
| <li class="">Without an abort handler, in-progress tasks cannot be aborted: the Cancel button in the Task List UI will be disabled</li> |
| </ul> |
| <p>The framework automatically skips execution if a task was aborted while pending: no manual check needed at task start.</p> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Always implement an abort handler for long-running tasks. This allows users to cancel unneeded tasks and free up worker capacity for other operations.</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=timeouts>Timeouts<a href=#timeouts class=hash-link aria-label="Direct link to Timeouts" title="Direct link to Timeouts" translate=no></a></h2> |
| <p>Set a timeout to automatically abort tasks that run too long:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">decorators </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> get_context</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">types </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> TaskOptions</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Set default timeout in decorator</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">timeout</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">300</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># 5 minutes</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">process_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> ctx </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> get_context</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> should_stop </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">False</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@ctx</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">on_abort</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">handle_abort</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">nonlocal</span><span class="token plain"> should_stop</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> should_stop </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> chunk </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> fetch_large_dataset</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dataset_id</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> should_stop</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> process</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">chunk</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Override timeout at call time</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> process_data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> dataset_id</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">123</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> options</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">timeout</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">600</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Override to 10 minutes</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=how-timeouts-work>How Timeouts Work<a href=#how-timeouts-work class=hash-link aria-label="Direct link to How Timeouts Work" title="Direct link to How Timeouts Work" translate=no></a></h3> |
| <p>The timeout timer starts when the task begins executing (status changes to <code>IN_PROGRESS</code>). When the timeout expires:</p> |
| <ol> |
| <li class=""> |
| <p><strong>With an abort handler registered:</strong> The task transitions to <code>ABORTING</code>, abort handlers run, then cleanup handlers run. The final status depends on handler execution:</p> |
| <ul> |
| <li class="">If handlers complete successfully → <code>TIMED_OUT</code> status</li> |
| <li class="">If handlers throw an exception → <code>FAILURE</code> status</li> |
| </ul> |
| </li> |
| <li class=""> |
| <p><strong>Without an abort handler:</strong> The framework cannot forcibly terminate the task. A warning is logged, and the task continues running. The Task List UI shows a warning indicator (⚠️) in the Details column to alert users that the timeout cannot be enforced.</p> |
| </li> |
| </ol> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=timeout-precedence>Timeout Precedence<a href=#timeout-precedence class=hash-link aria-label="Direct link to Timeout Precedence" title="Direct link to Timeout Precedence" translate=no></a></h3> |
| <table><thead><tr><th>Source<th>Priority<th>Example<tbody><tr><td><code>TaskOptions.timeout</code><td>Highest<td><code>options=TaskOptions(timeout=600)</code><tr><td><code>@task(timeout=...)</code><td>Default<td><code>@task(timeout=300)</code><tr><td>Not set<td>No timeout<td>Task runs indefinitely</table> |
| <p>Call-time options always override decorator defaults, allowing tasks to have sensible defaults while permitting callers to extend or shorten the timeout for specific use cases.</p> |
| <div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 16 16"><path fill-rule=evenodd d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg></span>warning</div><div class=admonitionContent_BuS1><p>Timeouts require an abort handler to be effective. Without one, the timeout triggers only a warning and the task continues running. Always implement an abort handler when using timeouts.</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=deduplication>Deduplication<a href=#deduplication class=hash-link aria-label="Direct link to Deduplication" title="Direct link to Deduplication" translate=no></a></h2> |
| <p>Use <code>task_key</code> to prevent duplicate task execution:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">types </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> TaskOptions</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Without key - creates new task each time (random UUID)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task1 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task2 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Different task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># With key - joins existing task if active</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task1 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> options</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task_key</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"report_123"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task2 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> options</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task_key</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"report_123"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Returns same task</span><br/></div></code></pre></div></div> |
| <p>When a task with matching key already exists, the user is added as a subscriber and the existing task is returned. This behavior is consistent across all scopes—private tasks naturally have only one subscriber since their deduplication key includes the user ID.</p> |
| <p>Deduplication only applies to active tasks (pending/in-progress). Once a task completes, a new task with the same key can be created.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=sync-join-and-wait>Sync Join-and-Wait<a href=#sync-join-and-wait class=hash-link aria-label="Direct link to Sync Join-and-Wait" title="Direct link to Sync Join-and-Wait" translate=no></a></h3> |
| <p>When a sync call joins an existing task, it blocks until the task completes:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token comment" style="color:rgb(106, 153, 85)"># Schedule async task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">options</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task_key</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"report_123"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Later sync call with same key blocks until completion of the active task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">task2 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> my_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">options</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task_key</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"report_123"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">assert</span><span class="token plain"> task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">uuid </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> task2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">uuid </span><span class="token comment" style="color:rgb(106, 153, 85)"># True</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">task2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">status</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># "success" (terminal status)</span><br/></div></code></pre></div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=task-scopes>Task Scopes<a href=#task-scopes class=hash-link aria-label="Direct link to Task Scopes" title="Direct link to Task Scopes" translate=no></a></h2> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">decorators </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> task</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> superset_core</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tasks</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">types </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> TaskScope</span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Private by default</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">private_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">scope</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskScope</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">SHARED</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Multiple users can subscribe</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">shared_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">scope</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">TaskScope</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">SYSTEM</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Admin-only visibility</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">system_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><br/></div></code></pre></div></div> |
| <table><thead><tr><th>Scope<th>Visibility<th>Cancel Behavior<tbody><tr><td><code>PRIVATE</code><td>Creator only<td>Cancels immediately<tr><td><code>SHARED</code><td>All subscribers<td>Last subscriber cancels; others unsubscribe<tr><td><code>SYSTEM</code><td>Admins only<td>Admin cancels</table> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=task-cleanup>Task Cleanup<a href=#task-cleanup class=hash-link aria-label="Direct link to Task Cleanup" title="Direct link to Task Cleanup" translate=no></a></h2> |
| <p>Completed tasks accumulate in the database over time. Configure a scheduled prune job to automatically remove old tasks:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token comment" style="color:rgb(106, 153, 85)"># In your superset_config.py, add to your Celery beat schedule:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain">CELERY_CONFIG</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">beat_schedule</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string" style="color:rgb(206, 145, 120)">"prune_tasks"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"task"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"prune_tasks"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"schedule"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> crontab</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">minute</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> hour</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Run daily at midnight</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"kwargs"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"retention_period_days"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">90</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Keep tasks for 90 days</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"max_rows_per_run"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10000</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># Limit deletions per run</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><br/></div></code></pre></div></div> |
| <p>The prune job only removes tasks in terminal states (<code>SUCCESS</code>, <code>FAILURE</code>, <code>ABORTED</code>, <code>TIMED_OUT</code>). Active tasks (<code>PENDING</code>, <code>IN_PROGRESS</code>, <code>ABORTING</code>) are never pruned.</p> |
| <p>See <code>superset/config.py</code> for a complete example configuration.</p> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>Distributed Coordination for Faster Notifications</div><div class=admonitionContent_BuS1><p>By default, abort detection and sync join-and-wait use database polling. Configure <code>DISTRIBUTED_COORDINATION_CONFIG</code> to enable Redis pub/sub for real-time notifications. See <a class="" href=/admin-docs/configuration/cache#signal-cache-backend>Distributed Coordination Backend</a> for configuration details.</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=api-reference>API Reference<a href=#api-reference class=hash-link aria-label="Direct link to API Reference" title="Direct link to API Reference" translate=no></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=task-decorator>@task Decorator<a href=#task-decorator class=hash-link aria-label="Direct link to @task Decorator" title="Direct link to @task Decorator" translate=no></a></h3> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> scope</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> TaskScope </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> TaskScope</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">PRIVATE</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> timeout</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <ul> |
| <li class=""><code>name</code>: Task identifier (defaults to function name)</li> |
| <li class=""><code>scope</code>: <code>PRIVATE</code>, <code>SHARED</code>, or <code>SYSTEM</code></li> |
| <li class=""><code>timeout</code>: Default timeout in seconds (can be overridden via <code>TaskOptions</code>)</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=taskcontext-methods>TaskContext Methods<a href=#taskcontext-methods class=hash-link aria-label="Direct link to TaskContext Methods" title="Direct link to TaskContext Methods" translate=no></a></h3> |
| <table><thead><tr><th>Method<th>Description<tbody><tr><td><code>update_task(progress, payload)</code><td>Update progress and/or custom payload<tr><td><code>on_cleanup(handler)</code><td>Register cleanup handler<tr><td><code>on_abort(handler)</code><td>Register abort handler (makes task abortable)</table> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=taskoptions>TaskOptions<a href=#taskoptions class=hash-link aria-label="Direct link to TaskOptions" title="Direct link to TaskOptions" translate=no></a></h3> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token plain">TaskOptions</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> task_key</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> task_name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">str</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> timeout</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">|</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <ul> |
| <li class=""><code>task_key</code>: Deduplication key (also used as display name if <code>task_name</code> is not set)</li> |
| <li class=""><code>task_name</code>: Human-readable display name for the Task List UI</li> |
| <li class=""><code>timeout</code>: Timeout in seconds (overrides decorator default)</li> |
| </ul> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Provide a descriptive <code>task_name</code> for better readability in the Task List UI. While <code>task_key</code> is used for deduplication and may be technical (e.g., <code>chart_export_123</code>), <code>task_name</code> can be user-friendly (e.g., <code>"Export Sales Chart 123"</code>).</div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=error-handling>Error Handling<a href=#error-handling class=hash-link aria-label="Direct link to Error Handling" title="Direct link to Error Handling" translate=no></a></h2> |
| <p>Let exceptions propagate: the framework captures them automatically and sets task status to <code>FAILURE</code>:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#9CDCFE;--prism-background-color:#1E1E1E><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#9CDCFE;background-color:#1E1E1E><code class=codeBlockLines_e6Vv><div class=token-line style=color:#9CDCFE><span class="token decorator annotation punctuation" style="color:rgb(212, 212, 212)">@task</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">risky_task</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">></span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># No try/catch needed - framework handles it</span><span class="token plain"></span><br/></div><div class=token-line style=color:#9CDCFE><span class="token plain"> result </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> operation_that_might_fail</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br/></div></code></pre></div></div> |
| <p>On failure, the framework records:</p> |
| <ul> |
| <li class=""><code>error_message</code>: Exception message</li> |
| <li class=""><code>exception_type</code>: Exception class name</li> |
| <li class=""><code>stack_trace</code>: Full traceback (visible when <code>SHOW_STACKTRACE=True</code>)</li> |
| </ul> |
| <p>In the Task List UI, failed tasks show error details when hovering over the status. When stack traces are enabled, a separate bug icon appears in the <strong>Details</strong> column for viewing the full traceback.</p> |
| <p>Cleanup handlers still run after an exception, so resources can be properly released as necessary.</p> |
| <div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 12 16"><path fill-rule=evenodd d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"/></svg></span>tip</div><div class=admonitionContent_BuS1><p>Use descriptive exception messages. In environments where stack traces are hidden (<code>SHOW_STACKTRACE=False</code>), users see only the error message and exception type when hovering over failed tasks. Clear messages help users troubleshoot issues without administrator assistance.</div></div></div></div></div><div class=row><div class="col col--12"><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/apache/superset/edit/master/docs/developer_docs/developer_docs/extensions/tasks.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class=theme-last-updated>Last updated<!-- --> on <b><time datetime=2026-07-11T22:03:24.000Z itemprop=dateModified>Jul 11, 2026</time></b> by <b>Elizabeth Thompson</b></span></div></div></footer></div></div></article><div class=row><div class="col col--12"><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/developer-docs/extensions/security><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Security</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/developer-docs/extensions/registry><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Community Extensions</div></a></nav></div></div></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#enabling-gtf class="table-of-contents__link toc-highlight">Enabling GTF</a><li><a href=#quick-start class="table-of-contents__link toc-highlight">Quick Start</a><ul><li><a href=#define-a-task class="table-of-contents__link toc-highlight">Define a Task</a><li><a href=#execute-a-task class="table-of-contents__link toc-highlight">Execute a Task</a><li><a href=#async-vs-sync-execution class="table-of-contents__link toc-highlight">Async vs Sync Execution</a></ul><li><a href=#task-lifecycle class="table-of-contents__link toc-highlight">Task Lifecycle</a><li><a href=#context-api class="table-of-contents__link toc-highlight">Context API</a><ul><li><a href=#updating-task-metadata class="table-of-contents__link toc-highlight">Updating Task Metadata</a><li><a href=#handlers class="table-of-contents__link toc-highlight">Handlers</a></ul><li><a href=#making-tasks-abortable class="table-of-contents__link toc-highlight">Making Tasks Abortable</a><li><a href=#timeouts class="table-of-contents__link toc-highlight">Timeouts</a><ul><li><a href=#how-timeouts-work class="table-of-contents__link toc-highlight">How Timeouts Work</a><li><a href=#timeout-precedence class="table-of-contents__link toc-highlight">Timeout Precedence</a></ul><li><a href=#deduplication class="table-of-contents__link toc-highlight">Deduplication</a><ul><li><a href=#sync-join-and-wait class="table-of-contents__link toc-highlight">Sync Join-and-Wait</a></ul><li><a href=#task-scopes class="table-of-contents__link toc-highlight">Task Scopes</a><li><a href=#task-cleanup class="table-of-contents__link toc-highlight">Task Cleanup</a><li><a href=#api-reference class="table-of-contents__link toc-highlight">API Reference</a><ul><li><a href=#task-decorator class="table-of-contents__link toc-highlight">@task Decorator</a><li><a href=#taskcontext-methods class="table-of-contents__link toc-highlight">TaskContext Methods</a><li><a href=#taskoptions class="table-of-contents__link toc-highlight">TaskOptions</a></ul><li><a href=#error-handling class="table-of-contents__link toc-highlight">Error Handling</a></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer"><div class="container container-fluid"><div class="footer__bottom text--center"><div class=footer__copyright> |
| <div class=footer__social-links> |
| <a href=https://bit.ly/join-superset-slack target=_blank rel="noopener noreferrer" title="Join us on Slack" aria-label=Slack> |
| <img src=/img/community/slack-symbol.svg alt=Slack /> |
| </a> |
| <a href=https://x.com/apachesuperset target=_blank rel="noopener noreferrer" title="Follow us on X" aria-label=X> |
| <img src=/img/community/x-symbol.svg alt=X /> |
| </a> |
| <a href=https://www.linkedin.com/company/apache-superset target=_blank rel="noopener noreferrer" title="Follow us on LinkedIn" aria-label=LinkedIn> |
| <img src=/img/community/linkedin-symbol.svg alt=LinkedIn /> |
| </a> |
| <a href=https://bsky.app/profile/apachesuperset.bsky.social target=_blank rel="noopener noreferrer" title="Follow us on Bluesky" aria-label=Bluesky> |
| <img src=/img/community/bluesky-symbol.svg alt=Bluesky /> |
| </a> |
| <a href=https://reddit.com/r/apache-superset target=_blank rel="noopener noreferrer" title="Follow us on Reddit" aria-label=Reddit> |
| <img src=/img/community/reddit-symbol.svg alt=Reddit /> |
| </a> |
| </div> |
| <div class=footer__ci-services> |
| <span>CI powered by</span> |
| <a href=https://www.netlify.com/ target=_blank rel="nofollow noopener noreferrer"><img src=/img/netlify.png alt=Netlify title="Netlify - Deploy Previews"/></a> |
| </div> |
| <p>Copyright © 2026, |
| The <a href=https://www.apache.org/ target=_blank rel=noreferrer>Apache Software Foundation</a>, |
| Licensed under the Apache <a href=https://apache.org/licenses/LICENSE-2.0 target=_blank rel=noreferrer>License</a>.</p> |
| <p><small>Apache Superset, Apache, Superset, the Superset logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation. |
| <a href=https://www.apache.org/ target=_blank>Apache Software Foundation</a> resources</small></p> |
| <img class=footer__divider src=/img/community/line.png alt=Divider /> |
| <p> |
| <small> |
| <a href=/admin-docs/security/ target=_blank rel=noreferrer>Security</a> | |
| <a href=https://www.apache.org/foundation/sponsorship.html target=_blank rel=noreferrer>Donate</a> | |
| <a href=https://www.apache.org/foundation/thanks.html target=_blank rel=noreferrer>Thanks</a> | |
| <a href=https://apache.org/events/current-event target=_blank rel=noreferrer>Events</a> | |
| <a href=https://apache.org/licenses/ target=_blank rel=noreferrer>License</a> | |
| <a href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank rel=noreferrer>Privacy</a> |
| </small> |
| </p> |
| <!-- telemetry/analytics pixel: --> |
| <img referrerpolicy=no-referrer-when-downgrade src="https://static.scarf.sh/a.png?x-pxid=39ae6855-95fc-4566-86e5-360d542b0a68"/> |
| </div></div></div></footer></div></body> |