Files
superqt/utilities/threading/index.html
2025-03-28 15:31:28 -04:00

3055 lines
93 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="missing widgets and components for PyQt/PySide">
<link rel="canonical" href="https://github.com/pyapp-kit/superqt/utilities/threading/">
<link rel="prev" href="../thread_decorators/">
<link rel="next" href="../throttling/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.49">
<title>Thread workers - superqt</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.6f8fc17f.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/_mkdocstrings.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#thread-workers" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="superqt" class="md-header__button md-logo" aria-label="superqt" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
superqt
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Thread workers
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/pyapp-kit/superqt" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
pyapp-kit/superqt
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="superqt" class="md-nav__button md-logo" aria-label="superqt" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
superqt
</label>
<div class="md-nav__source">
<a href="https://github.com/pyapp-kit/superqt" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
pyapp-kit/superqt
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
superqt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Utilities
</span>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Utilities
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cmap/" class="md-nav__link">
<span class="md-ellipsis">
Colormap utilities
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../code_syntax_highlight/" class="md-nav__link">
<span class="md-ellipsis">
CodeSyntaxHighlight
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../error_dialog_contexts/" class="md-nav__link">
<span class="md-ellipsis">
Error message context manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../fonticon/" class="md-nav__link">
<span class="md-ellipsis">
Font icons
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../iconify/" class="md-nav__link">
<span class="md-ellipsis">
QIconifyIcon
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qmessagehandler/" class="md-nav__link">
<span class="md-ellipsis">
QMessageHandler
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../signal_utils/" class="md-nav__link">
<span class="md-ellipsis">
Signal Utilities
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../thread_decorators/" class="md-nav__link">
<span class="md-ellipsis">
Threading decorators
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Thread workers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Thread workers
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase" class="md-nav__link">
<span class="md-ellipsis">
WorkerBase
</span>
</a>
<nav class="md-nav" aria-label="WorkerBase">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.abort_requested" class="md-nav__link">
<span class="md-ellipsis">
abort_requested
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.is_running" class="md-nav__link">
<span class="md-ellipsis">
is_running
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.__getattr__" class="md-nav__link">
<span class="md-ellipsis">
__getattr__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.await_workers" class="md-nav__link">
<span class="md-ellipsis">
await_workers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.quit" class="md-nav__link">
<span class="md-ellipsis">
quit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.start" class="md-nav__link">
<span class="md-ellipsis">
start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.work" class="md-nav__link">
<span class="md-ellipsis">
work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.FunctionWorker" class="md-nav__link">
<span class="md-ellipsis">
FunctionWorker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker" class="md-nav__link">
<span class="md-ellipsis">
GeneratorWorker
</span>
</a>
<nav class="md-nav" aria-label="GeneratorWorker">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.is_paused" class="md-nav__link">
<span class="md-ellipsis">
is_paused
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.pause" class="md-nav__link">
<span class="md-ellipsis">
pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.resume" class="md-nav__link">
<span class="md-ellipsis">
resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.send" class="md-nav__link">
<span class="md-ellipsis">
send
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.toggle_pause" class="md-nav__link">
<span class="md-ellipsis">
toggle_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.work" class="md-nav__link">
<span class="md-ellipsis">
work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#convenience-functions" class="md-nav__link">
<span class="md-ellipsis">
Convenience functions
</span>
</a>
<nav class="md-nav" aria-label="Convenience functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.thread_worker" class="md-nav__link">
<span class="md-ellipsis">
thread_worker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.create_worker" class="md-nav__link">
<span class="md-ellipsis">
create_worker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.new_worker_qthread" class="md-nav__link">
<span class="md-ellipsis">
new_worker_qthread
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../throttling/" class="md-nav__link">
<span class="md-ellipsis">
Throttling &amp; Debouncing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<div class="md-nav__link md-nav__container">
<a href="../../widgets/" class="md-nav__link ">
<span class="md-ellipsis">
Widgets
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Widgets
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../widgets/colormap_catalog/" class="md-nav__link">
<span class="md-ellipsis">
CmapCatalogComboBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qcollapsible/" class="md-nav__link">
<span class="md-ellipsis">
QCollapsible
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qcolorcombobox/" class="md-nav__link">
<span class="md-ellipsis">
QColorComboBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qcolormap/" class="md-nav__link">
<span class="md-ellipsis">
QColormapComboBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qdoublerangeslider/" class="md-nav__link">
<span class="md-ellipsis">
QDoubleRangeSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qdoubleslider/" class="md-nav__link">
<span class="md-ellipsis">
QDoubleSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qelidinglabel/" class="md-nav__link">
<span class="md-ellipsis">
QElidingLabel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qenumcombobox/" class="md-nav__link">
<span class="md-ellipsis">
QEnumComboBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qflowlayout/" class="md-nav__link">
<span class="md-ellipsis">
QFlowLayout
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qlabeleddoublerangeslider/" class="md-nav__link">
<span class="md-ellipsis">
QLabeledDoubleRangeSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qlabeleddoubleslider/" class="md-nav__link">
<span class="md-ellipsis">
QLabeledDoubleSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qlabeledrangeslider/" class="md-nav__link">
<span class="md-ellipsis">
QLabeledRangeSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qlabeledslider/" class="md-nav__link">
<span class="md-ellipsis">
QLabeledSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qlargeintspinbox/" class="md-nav__link">
<span class="md-ellipsis">
QLargeIntSpinBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qquantity/" class="md-nav__link">
<span class="md-ellipsis">
QQuantity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qrangeslider/" class="md-nav__link">
<span class="md-ellipsis">
QRangeSlider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qsearchablecombobox/" class="md-nav__link">
<span class="md-ellipsis">
QSearchableComboBox
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qsearchablelistwidget/" class="md-nav__link">
<span class="md-ellipsis">
QSearchableListWidget
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qsearchabletreewidget/" class="md-nav__link">
<span class="md-ellipsis">
QSearchableTreeWidget
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../widgets/qtoggleswitch/" class="md-nav__link">
<span class="md-ellipsis">
QToggleSwitch
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase" class="md-nav__link">
<span class="md-ellipsis">
WorkerBase
</span>
</a>
<nav class="md-nav" aria-label="WorkerBase">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.abort_requested" class="md-nav__link">
<span class="md-ellipsis">
abort_requested
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.is_running" class="md-nav__link">
<span class="md-ellipsis">
is_running
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.__getattr__" class="md-nav__link">
<span class="md-ellipsis">
__getattr__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.await_workers" class="md-nav__link">
<span class="md-ellipsis">
await_workers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.quit" class="md-nav__link">
<span class="md-ellipsis">
quit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.start" class="md-nav__link">
<span class="md-ellipsis">
start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.WorkerBase.work" class="md-nav__link">
<span class="md-ellipsis">
work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.FunctionWorker" class="md-nav__link">
<span class="md-ellipsis">
FunctionWorker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker" class="md-nav__link">
<span class="md-ellipsis">
GeneratorWorker
</span>
</a>
<nav class="md-nav" aria-label="GeneratorWorker">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.is_paused" class="md-nav__link">
<span class="md-ellipsis">
is_paused
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.pause" class="md-nav__link">
<span class="md-ellipsis">
pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.resume" class="md-nav__link">
<span class="md-ellipsis">
resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.send" class="md-nav__link">
<span class="md-ellipsis">
send
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.toggle_pause" class="md-nav__link">
<span class="md-ellipsis">
toggle_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.GeneratorWorker.work" class="md-nav__link">
<span class="md-ellipsis">
work
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#convenience-functions" class="md-nav__link">
<span class="md-ellipsis">
Convenience functions
</span>
</a>
<nav class="md-nav" aria-label="Convenience functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#superqt.utils.thread_worker" class="md-nav__link">
<span class="md-ellipsis">
thread_worker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.create_worker" class="md-nav__link">
<span class="md-ellipsis">
create_worker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#superqt.utils.new_worker_qthread" class="md-nav__link">
<span class="md-ellipsis">
new_worker_qthread
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="thread-workers">Thread workers<a class="headerlink" href="#thread-workers" title="Permanent link">#</a></h1>
<p>The objects in this module provide utilities for running tasks in a separate
thread. In general (with the exception of <code>new_worker_qthread</code>), everything
here wraps Qt's <a href="https://doc.qt.io/qt-6/qrunnable.html">QRunnable API</a>.</p>
<p>The highest level object is the
<a class="autorefs autorefs-internal" href="#superqt.utils.thread_worker"><code>@thread_worker</code></a> decorator. It was originally
written for <code>napari</code>, and was later extracted into <code>superqt</code>. You may also be
interested in reading the <a href="https://napari.org/stable/guides/threading.html#threading-in-napari-with-thread-worker">napari
documentation</a> on this feature,
which provides a more in-depth/introductory usage guide.</p>
<p>For additional control, you can create your own
<a class="autorefs autorefs-internal" href="#superqt.utils.FunctionWorker"><code>FunctionWorker</code></a> or
<a class="autorefs autorefs-internal" href="#superqt.utils.GeneratorWorker"><code>GeneratorWorker</code></a> objects.</p>
<div class="doc doc-object doc-class">
<h2 id="superqt.utils.WorkerBase" class="doc doc-heading">
<code>superqt.utils.WorkerBase</code>
<a href="#superqt.utils.WorkerBase" class="headerlink" title="Permanent link">#</a></h2>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><span title="qtpy.QtCore.QRunnable">QRunnable</span></code>, <code><a class="autorefs autorefs-external" title="typing.Generic" href="https://docs.python.org/3/library/typing.html#typing.Generic">Generic</a>[<span title="superqt.utils._qthreading._R">_R</span>]</code></p>
<p>Base class for creating a Worker that can run in another thread.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>SignalsClass</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#type">type</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A QObject subclass that contains signals, by default WorkerBaseSignals</p>
</div>
</td>
<td>
<code><span title="superqt.utils._qthreading.WorkerBaseSignals">WorkerBaseSignals</span></code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Attributes:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code><span title="superqt.utils.WorkerBase.signals">signals</span></code></td>
<td>
<code><span title="superqt.utils._qthreading.WorkerBaseSignals">WorkerBaseSignals</span></code>
</td>
<td>
<div class="doc-md-description">
<p>signal emitter object. To allow identify which worker thread emitted signal.</p>
</div>
</td>
</tr>
</tbody>
</table>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="superqt.utils.WorkerBase.abort_requested" class="doc doc-heading">
<code class="highlight language-python"><span class="n">abort_requested</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#superqt.utils.WorkerBase.abort_requested" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Whether the worker has been requested to stop.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="superqt.utils.WorkerBase.is_running" class="doc doc-heading">
<code class="highlight language-python"><span class="n">is_running</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#superqt.utils.WorkerBase.is_running" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Whether the worker has been started.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.__getattr__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__getattr__</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
<a href="#superqt.utils.WorkerBase.__getattr__" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Pass through attr requests to signals to simplify connection API.</p>
<p>The goal is to enable <code>worker.yielded.connect</code> instead of
<code>worker.signals.yielded.connect</code>. Because multiple inheritance of Qt
classes is not well supported in PyQt, we have to use composition here
(signals are provided by QObjects, and QRunnable is not a QObject). So
this passthrough allows us to connect to signals on the <code>_signals</code>
object.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.await_workers" class="doc doc-heading">
<code class="highlight language-python"><span class="n">await_workers</span><span class="p">(</span><span class="n">msecs</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#superqt.utils.WorkerBase.await_workers" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Ask all workers to quit, and wait up to <code>msec</code> for quit.</p>
<p>Attempts to clean up all running workers by calling <code>worker.quit()</code>
method. Any workers in the <code>WorkerBase._worker_set</code> set will have this
method.</p>
<p>By default, this function will block indefinitely, until worker threads
finish. If a timeout is provided, a <code>RuntimeError</code> will be raised if
the workers do not gracefully exit in the time requests, but the threads
will NOT be killed. It is (currently) left to the user to use their OS
to force-quit rogue threads.</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>If the user does not put any yields in their function, and the function
is super long, it will just hang... For instance, there's no graceful
way to kill this thread in python:</p>
<div class="highlight"><pre><span></span><code><span class="nd">@thread_worker</span>
<span class="k">def</span> <span class="nf">ZZZzzz</span><span class="p">():</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10000000</span><span class="p">)</span>
</code></pre></div>
<p>This is why it's always advisable to use a generator that periodically
yields for long-running computations in another thread.</p>
<p>See <a href="https://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread">this stack-overflow
post</a>
for a good discussion on the difficulty of killing a rogue python thread:</p>
</div>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>msecs</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#int">int</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Waits up to msecs milliseconds for all threads to exit and removes all
threads from the thread pool. If msecs is <code>None</code> (the default), the
timeout is ignored (waits for the last thread to exit).</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/exceptions.html#RuntimeError">RuntimeError</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If a timeout is provided and workers do not quit successfully within
the time allotted.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.quit" class="doc doc-heading">
<code class="highlight language-python"><span class="n">quit</span><span class="p">()</span></code>
<a href="#superqt.utils.WorkerBase.quit" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Send a request to abort the worker.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is entirely up to subclasses to honor this method by checking
<code>self.abort_requested</code> periodically in their <code>worker.work</code>
method, and exiting if <code>True</code>.</p>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.run" class="doc doc-heading">
<code class="highlight language-python"><span class="n">run</span><span class="p">()</span></code>
<a href="#superqt.utils.WorkerBase.run" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Start the worker.</p>
<p>The end-user should never need to call this function.
But it cannot be made private or renamed, since it is called by Qt.</p>
<p>The order of method calls when starting a worker is:</p>
<div class="highlight"><pre><span></span><code> calls QThreadPool.globalInstance().start(worker)
| triggered by the QThreadPool.start() method
| | called by worker.run
| | |
V V V
worker.start -&gt; worker.run -&gt; worker.work
</code></pre></div>
<p><strong>This</strong> is the function that actually gets called when calling
<code>QThreadPool.start(worker)</code>. It simply wraps the <code>work()</code>
method, and emits a few signals. Subclasses should NOT override this
method (except with good reason), and instead should implement
<code>work()</code>.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.start" class="doc doc-heading">
<code class="highlight language-python"><span class="n">start</span><span class="p">()</span></code>
<a href="#superqt.utils.WorkerBase.start" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Start this worker in a thread and add it to the global threadpool.</p>
<p>The order of method calls when starting a worker is:</p>
<div class="highlight"><pre><span></span><code> calls QThreadPool.globalInstance().start(worker)
| triggered by the QThreadPool.start() method
| | called by worker.run
| | |
V V V
worker.start -&gt; worker.run -&gt; worker.work
</code></pre></div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.WorkerBase.work" class="doc doc-heading">
<code class="highlight language-python"><span class="n">work</span><span class="p">()</span></code>
<a href="#superqt.utils.WorkerBase.work" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Main method to execute the worker.</p>
<p>The end-user should never need to call this function.
But subclasses must implement this method (See
<a class="autorefs autorefs-internal" href="#superqt.utils.GeneratorWorker.work"><code>GeneratorFunction.work</code></a> for
an example implementation). Minimally, it should check <code>self.abort_requested</code>
periodically and exit if True.</p>
<p><span class="doc-section-title">Examples:</span></p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">MyWorker</span><span class="p">(</span><span class="n">WorkerBase</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">work</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">abort_requested</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aborted</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span>
<span class="k">break</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">max_iters</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</code></pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="superqt.utils.FunctionWorker" class="doc doc-heading">
<code>superqt.utils.FunctionWorker</code>
<a href="#superqt.utils.FunctionWorker" class="headerlink" title="Permanent link">#</a></h2>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="superqt.utils._qthreading.WorkerBase" href="#superqt.utils.WorkerBase">WorkerBase</a>[<span title="superqt.utils._qthreading._R">_R</span>]</code></p>
<p>QRunnable with signals that wraps a simple long-running function.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p><code>FunctionWorker</code> does not provide a way to stop a very long-running
function (e.g. <code>time.sleep(10000)</code>). So whenever possible, it is better to
implement your long running function as a generator that yields periodically,
and use the <a class="autorefs autorefs-internal" href="#superqt.utils.GeneratorWorker"><code>GeneratorWorker</code></a> instead.</p>
</div>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>func</code>
</td>
<td>
<code><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A function to call in another thread</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>*args</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to the function</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>**kwargs</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to the function</p>
</div>
</td>
<td>
<code>{}</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/exceptions.html#TypeError">TypeError</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If <code>func</code> is a generator function and not a regular function.</p>
</div>
</td>
</tr>
</tbody>
</table>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="superqt.utils.GeneratorWorker" class="doc doc-heading">
<code>superqt.utils.GeneratorWorker</code>
<a href="#superqt.utils.GeneratorWorker" class="headerlink" title="Permanent link">#</a></h2>
<div class="doc doc-contents first">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="superqt.utils._qthreading.WorkerBase" href="#superqt.utils.WorkerBase">WorkerBase</a></code>, <code><a class="autorefs autorefs-external" title="typing.Generic" href="https://docs.python.org/3/library/typing.html#typing.Generic">Generic</a>[<span title="superqt.utils._qthreading._Y">_Y</span>, <span title="superqt.utils._qthreading._S">_S</span>, <span title="superqt.utils._qthreading._R">_R</span>]</code></p>
<p>QRunnable with signals that wraps a long-running generator.</p>
<p>Provides a convenient way to run a generator function in another thread,
while allowing 2-way communication between threads, using plain-python
generator syntax in the original function.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>func</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#callable">callable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The function being run in another thread. May be a generator function.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>SignalsClass</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#type">type</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A QObject subclass that contains signals, by default
GeneratorWorkerSignals</p>
</div>
</td>
<td>
<code><span title="superqt.utils._qthreading.GeneratorWorkerSignals">GeneratorWorkerSignals</span></code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>*args</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Will be passed to func on instantiation</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>**kwargs</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Will be passed to func on instantiation</p>
</div>
</td>
<td>
<code>{}</code>
</td>
</tr>
</tbody>
</table>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="superqt.utils.GeneratorWorker.is_paused" class="doc doc-heading">
<code class="highlight language-python"><span class="n">is_paused</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#superqt.utils.GeneratorWorker.is_paused" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Whether the worker is currently paused.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.GeneratorWorker.pause" class="doc doc-heading">
<code class="highlight language-python"><span class="n">pause</span><span class="p">()</span></code>
<a href="#superqt.utils.GeneratorWorker.pause" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Request to pause the worker.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.GeneratorWorker.resume" class="doc doc-heading">
<code class="highlight language-python"><span class="n">resume</span><span class="p">()</span></code>
<a href="#superqt.utils.GeneratorWorker.resume" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Send a request to resume the worker.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.GeneratorWorker.send" class="doc doc-heading">
<code class="highlight language-python"><span class="n">send</span><span class="p">(</span><span class="n">value</span><span class="p">)</span></code>
<a href="#superqt.utils.GeneratorWorker.send" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Send a value into the function (if a generator was used).</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.GeneratorWorker.toggle_pause" class="doc doc-heading">
<code class="highlight language-python"><span class="n">toggle_pause</span><span class="p">()</span></code>
<a href="#superqt.utils.GeneratorWorker.toggle_pause" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Request to pause the worker if playing or resume if paused.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.GeneratorWorker.work" class="doc doc-heading">
<code class="highlight language-python"><span class="n">work</span><span class="p">()</span></code>
<a href="#superqt.utils.GeneratorWorker.work" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents ">
<p>Core event loop that calls the original function.</p>
<p>Enters a continual loop, yielding and returning from the original
function. Checks for various events (quit, pause, resume, etc...).
(To clarify: we are creating a rudimentary event loop here because
there IS NO Qt event loop running in the other thread to hook into)</p>
</div>
</div>
</div>
</div>
</div><h2 id="convenience-functions">Convenience functions<a class="headerlink" href="#convenience-functions" title="Permanent link">#</a></h2>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.thread_worker" class="doc doc-heading">
<code class="highlight language-python"><span class="n">superqt</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">thread_worker</span><span class="p">(</span><span class="n">function</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">start_thread</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">connect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">worker_class</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ignore_errors</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
<a href="#superqt.utils.thread_worker" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc-overloads">
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">thread_worker</span><span class="p">(</span>
<span class="n">function</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">Generator</span><span class="p">[</span><span class="n">_Y</span><span class="p">,</span> <span class="n">_S</span><span class="p">,</span> <span class="n">_R</span><span class="p">]],</span>
<span class="n">start_thread</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">connect</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Callable</span> <span class="o">|</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Callable</span><span class="p">]]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">worker_class</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">WorkerBase</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">ignore_errors</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">GeneratorWorker</span><span class="p">[</span><span class="n">_Y</span><span class="p">,</span> <span class="n">_S</span><span class="p">,</span> <span class="n">_R</span><span class="p">]]</span>
</code></pre></div><div class="doc-signature highlight"><pre><span></span><code><span class="nf">thread_worker</span><span class="p">(</span>
<span class="n">function</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">_R</span><span class="p">],</span>
<span class="n">start_thread</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">connect</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Callable</span> <span class="o">|</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Callable</span><span class="p">]]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">worker_class</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">WorkerBase</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">ignore_errors</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">FunctionWorker</span><span class="p">[</span><span class="n">_R</span><span class="p">]]</span>
</code></pre></div><div class="doc-signature highlight"><pre><span></span><code><span class="nf">thread_worker</span><span class="p">(</span>
<span class="n">function</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">start_thread</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">connect</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Callable</span> <span class="o">|</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Callable</span><span class="p">]]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">worker_class</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">WorkerBase</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">ignore_errors</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Callable</span><span class="p">[</span>
<span class="p">[</span><span class="n">Callable</span><span class="p">],</span>
<span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">FunctionWorker</span> <span class="o">|</span> <span class="n">GeneratorWorker</span><span class="p">],</span>
<span class="p">]</span>
</code></pre></div> </div>
<div class="doc doc-contents first">
<p>Decorator that runs a function in a separate thread when called.</p>
<p>When called, the decorated function returns a
<a class="autorefs autorefs-internal" href="#superqt.utils.WorkerBase"><code>WorkerBase</code></a>. See
<a class="autorefs autorefs-internal" href="#superqt.utils.create_worker"><code>create_worker</code></a> for additional keyword arguments that
can be used
when calling the function.</p>
<p>The returned worker will have these signals:</p>
<ul>
<li><strong>started</strong>: emitted when the work is started</li>
<li><strong>finished</strong>: emitted when the work is finished</li>
<li><strong>returned</strong>: emitted with return value</li>
<li><strong>errored</strong>: emitted with error object on Exception</li>
</ul>
<p>It will also have a <code>worker.start()</code> method that can be used to start
execution of the function in another thread. (useful if you need to connect
callbacks to signals prior to execution)</p>
<p>If the decorated function is a generator, the returned worker will also
provide these signals:</p>
<ul>
<li><strong>yielded</strong>: emitted with yielded values</li>
<li><strong>paused</strong>: emitted when a running job has successfully paused</li>
<li><strong>resumed</strong>: emitted when a paused job has successfully resumed</li>
<li><strong>aborted</strong>: emitted when a running job is successfully aborted</li>
</ul>
<p>And these methods:</p>
<ul>
<li><strong>quit</strong>: ask the thread to quit</li>
<li><strong>toggle_paused</strong>: toggle the running state of the thread.</li>
<li><strong>send</strong>: send a value into the generator. (This requires that your
decorator function uses the <code>value = yield</code> syntax)</li>
</ul>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>function</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#callable">callable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Function to call in another thread. For communication between threads
may be a generator function.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>start_thread</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to immediaetly start the thread. If False, the returned worker
must be manually started with <code>worker.start()</code>. by default it will be
<code>False</code> if the <code>_connect</code> argument is <code>None</code>, otherwise <code>True</code>.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>connect</code>
</td>
<td>
<code>Dict[<a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a>, Union[<a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a>, <a class="autorefs autorefs-external" title="collections.abc.Sequence" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence">Sequence</a>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A mapping of <code>"signal_name"</code> -&gt; <code>callable</code> or list of <code>callable</code>:
callback functions to connect to the various signals offered by the
worker class. by default None</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>worker_class</code>
</td>
<td>
<code>Type[<a class="autorefs autorefs-internal" title="superqt.utils._qthreading.WorkerBase" href="#superqt.utils.WorkerBase">WorkerBase</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The <a class="autorefs autorefs-internal" href="#superqt.utils.WorkerBase"><code>WorkerBase</code></a> to instantiate, by default
<a class="autorefs autorefs-internal" href="#superqt.utils.FunctionWorker"><code>FunctionWorker</code></a> will be used if <code>func</code> is a
regular function, and <a class="autorefs autorefs-internal" href="#superqt.utils.GeneratorWorker"><code>GeneratorWorker</code></a> will be
used if it is a generator.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>ignore_errors</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If <code>False</code> (the default), errors raised in the other thread will be
reraised in the main thread (makes debugging significantly easier).</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#callable">callable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>function that creates a worker, puts it in a new thread and returns
the worker instance.</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Examples:</span></p>
<div class="highlight"><pre><span></span><code><span class="nd">@thread_worker</span>
<span class="k">def</span> <span class="nf">long_function</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
<span class="c1"># do work, periodically yielding</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">start</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">end</span><span class="p">:</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">i</span>
<span class="c1"># do teardown</span>
<span class="k">return</span> <span class="s2">&quot;anything&quot;</span>
<span class="c1"># call the function to start running in another thread.</span>
<span class="n">worker</span> <span class="o">=</span> <span class="n">long_function</span><span class="p">()</span>
<span class="c1"># connect signals here if desired... or they may be added using the</span>
<span class="c1"># `connect` argument in the `@thread_worker` decorator... in which</span>
<span class="c1"># case the worker will start immediately when long_function() is called</span>
<span class="n">worker</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</code></pre></div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.create_worker" class="doc doc-heading">
<code class="highlight language-python"><span class="n">superqt</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">create_worker</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">_start_thread</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_connect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_worker_class</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_ignore_errors</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></code>
<a href="#superqt.utils.create_worker" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc-overloads">
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">create_worker</span><span class="p">(</span>
<span class="n">func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">Generator</span><span class="p">[</span><span class="n">_Y</span><span class="p">,</span> <span class="n">_S</span><span class="p">,</span> <span class="n">_R</span><span class="p">]],</span>
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
<span class="n">_start_thread</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_connect</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Callable</span> <span class="o">|</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Callable</span><span class="p">]]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_worker_class</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">GeneratorWorker</span><span class="p">]</span>
<span class="o">|</span> <span class="nb">type</span><span class="p">[</span><span class="n">FunctionWorker</span><span class="p">]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_ignore_errors</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">GeneratorWorker</span><span class="p">[</span><span class="n">_Y</span><span class="p">,</span> <span class="n">_S</span><span class="p">,</span> <span class="n">_R</span><span class="p">]</span>
</code></pre></div><div class="doc-signature highlight"><pre><span></span><code><span class="nf">create_worker</span><span class="p">(</span>
<span class="n">func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[</span><span class="n">_P</span><span class="p">,</span> <span class="n">_R</span><span class="p">],</span>
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
<span class="n">_start_thread</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_connect</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Callable</span> <span class="o">|</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Callable</span><span class="p">]]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_worker_class</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">GeneratorWorker</span><span class="p">]</span>
<span class="o">|</span> <span class="nb">type</span><span class="p">[</span><span class="n">FunctionWorker</span><span class="p">]</span>
<span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">_ignore_errors</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FunctionWorker</span><span class="p">[</span><span class="n">_R</span><span class="p">]</span>
</code></pre></div> </div>
<div class="doc doc-contents first">
<p>Convenience function to start a function in another thread.</p>
<p>By default, uses <code>FunctionWorker</code> for functions and <code>GeneratorWorker</code> for
generators, but a custom <code>WorkerBase</code> subclass may be provided. If so, it must be a
subclass of <code>WorkerBase</code>, which defines a standard set of signals and a run method.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>func</code>
</td>
<td>
<code><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The function to call in another thread.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_start_thread</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to immediaetly start the thread. If False, the returned worker
must be manually started with <code>worker.start()</code>. by default it will be
<code>False</code> if the <code>_connect</code> argument is <code>None</code>, otherwise <code>True</code>.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_connect</code>
</td>
<td>
<code>Dict[<a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a>, Union[<a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a>, <a class="autorefs autorefs-external" title="collections.abc.Sequence" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence">Sequence</a>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A mapping of <code>"signal_name"</code> -&gt; <code>callable</code> or list of <code>callable</code>:
callback functions to connect to the various signals offered by the
worker class. by default <code>None</code></p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_worker_class</code>
</td>
<td>
<code>type of `GeneratorWorker` or `FunctionWorker`</code>
</td>
<td>
<div class="doc-md-description">
<p>The <a class="autorefs autorefs-internal" href="#superqt.utils.WorkerBase"><code>WorkerBase</code></a> to instantiate, by default
<a class="autorefs autorefs-internal" href="#superqt.utils.FunctionWorker"><code>FunctionWorker</code></a> will be used if <code>func</code> is a
regular function, and <a class="autorefs autorefs-internal" href="#superqt.utils.GeneratorWorker"><code>GeneratorWorker</code></a> will be
used if it is a generator.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_ignore_errors</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If <code>False</code> (the default), errors raised in the other thread will be
reraised in the main thread (makes debugging significantly easier).</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>*args</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to <code>func</code></p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>**kwargs</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to <code>func</code></p>
</div>
</td>
<td>
<code>{}</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>worker</code></td> <td>
<code><a class="autorefs autorefs-internal" title="superqt.utils._qthreading.WorkerBase" href="#superqt.utils.WorkerBase">WorkerBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>An instantiated worker. If <code>_start_thread</code> was <code>False</code>, the worker
will have a <code>.start()</code> method that can be used to start the thread.</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/exceptions.html#TypeError">TypeError</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If a worker_class is provided that is not a subclass of WorkerBase.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/exceptions.html#TypeError">TypeError</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If _connect is provided and is not a dict of <code>{str: callable}</code></p>
</div>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Examples:</span></p>
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">long_function</span><span class="p">(</span><span class="n">duration</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">duration</span><span class="p">)</span>
<span class="n">worker</span> <span class="o">=</span> <span class="n">create_worker</span><span class="p">(</span><span class="n">long_function</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</code></pre></div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="superqt.utils.new_worker_qthread" class="doc doc-heading">
<code class="highlight language-python"><span class="n">superqt</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">new_worker_qthread</span><span class="p">(</span><span class="n">Worker</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">_start_thread</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_connect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></code>
<a href="#superqt.utils.new_worker_qthread" class="headerlink" title="Permanent link">#</a></h3>
<div class="doc doc-contents first">
<p>Convenience function to start a worker in a <code>QThread</code>.</p>
<p>thread, not as the actual code or object that runs in that
thread. The QThread object is created on the main thread and lives there.</p>
<p>Worker objects which derive from QObject are the things that actually do
the work. They can be moved to a QThread as is done here.</p>
<details>
<summary>Mostly ignorable detail</summary>
<p>While the signals/slots syntax of the worker looks very similar to
standard "single-threaded" signals &amp; slots, note that inter-thread
signals and slots (automatically) use an event-based QueuedConnection, while
intra-thread signals use a DirectConnection. See <a href="https://doc.qt.io/qt-6/threads-qobject.html#signals-and-slots-across-threads&gt;">Signals and Slots Across
Threads</a></p>
</details>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>Worker</code>
</td>
<td>
<code><span title="qtpy.QtCore.QObject">QObject</span></code>
</td>
<td>
<div class="doc-md-description">
<p>QObject type that implements a <code>work()</code> method. The Worker should also
emit a finished signal when the work is done.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_start_thread</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If True, thread will be started immediately, otherwise, thread must
be manually started with thread.start().</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>_connect</code>
</td>
<td>
<code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#dict">dict</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Optional dictionary of {signal: function} to connect to the new worker.
for instance: _connect = {'incremented': myfunc} will result in:
worker.incremented.connect(myfunc)</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>*args</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to the Worker class on instantiation.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>**kwargs</code>
</td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>will be passed to the Worker class on instantiation.</p>
</div>
</td>
<td>
<code>{}</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>worker</code></td> <td>
<code><a class="autorefs autorefs-internal" title="superqt.utils._qthreading.WorkerBase" href="#superqt.utils.WorkerBase">WorkerBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The created worker.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code>thread</code></td> <td>
<code><span title="qtpy.QtCore.QThread">QThread</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The thread on which the worker is running.</p>
</div>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Examples:</span></p>
<p>Create some QObject that has a long-running work method:</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">Worker</span><span class="p">(</span><span class="n">QObject</span><span class="p">):</span>
<span class="n">finished</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">()</span>
<span class="n">increment</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argument</span> <span class="o">=</span> <span class="n">argument</span>
<span class="nd">@Slot</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">work</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># some long running task...</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">increment</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">finished</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span>
<span class="n">worker</span><span class="p">,</span> <span class="n">thread</span> <span class="o">=</span> <span class="n">new_worker_qthread</span><span class="p">(</span>
<span class="n">Worker</span><span class="p">,</span>
<span class="s2">&quot;argument&quot;</span><span class="p">,</span>
<span class="n">_start_thread</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">_connect</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;increment&quot;</span><span class="p">:</span> <span class="nb">print</span><span class="p">},</span>
<span class="p">)</span>
</code></pre></div>
</div>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2021 - 2022
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.instant", "navigation.indexes", "navigation.expand", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.88dd0f4e.min.js"></script>
</body>
</html>