[{"data":1,"prerenderedAt":412},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fworker-and-handlers":115,"\u002Fapi\u002Fworker-and-handlers-surround":407},[4,36,57,88,104],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F2.install","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F3.quickstart","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Testing","\u002Fgetting-started\u002Ftesting","1.getting-started\u002F4.testing","i-lucide-flask-conical",{"title":31,"path":32,"stem":33,"icon":34},"CLI","\u002Fgetting-started\u002Fcli","1.getting-started\u002F5.cli","i-lucide-terminal",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Concepts","i-lucide-boxes","\u002Fconcepts","2.concepts",[42,47,52],{"title":43,"path":44,"stem":45,"icon":46},"SQL-first contract","\u002Fconcepts\u002Fsql-first-contract","2.concepts\u002F1.sql-first-contract","i-lucide-database",{"title":48,"path":49,"stem":50,"icon":51},"Jobs and status","\u002Fconcepts\u002Fjobs-and-status","2.concepts\u002F2.jobs-and-status","i-lucide-list-checks",{"title":53,"path":54,"stem":55,"icon":56},"Fencing and settles","\u002Fconcepts\u002Ffencing-and-settles","2.concepts\u002F3.fencing-and-settles","i-lucide-shield",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":35},"API","i-lucide-code-2","\u002Fapi","3.api",[63,68,73,78,83],{"title":64,"path":65,"stem":66,"icon":67},"Enqueue","\u002Fapi\u002Fenqueue","3.api\u002F1.enqueue","i-lucide-plus-circle",{"title":69,"path":70,"stem":71,"icon":72},"Claim and heartbeat","\u002Fapi\u002Fclaim-and-heartbeat","3.api\u002F2.claim-and-heartbeat","i-lucide-hand",{"title":74,"path":75,"stem":76,"icon":77},"Worker and handlers","\u002Fapi\u002Fworker-and-handlers","3.api\u002F3.worker-and-handlers","i-lucide-cpu",{"title":79,"path":80,"stem":81,"icon":82},"HTTP facade","\u002Fapi\u002Fhttp-facade","3.api\u002F4.http-facade","i-lucide-globe",{"title":84,"path":85,"stem":86,"icon":87},"Authorization","\u002Fapi\u002Fauthorization","3.api\u002F5.authorization","i-lucide-key-round",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":35},"Operations","i-lucide-activity","\u002Foperations","4.operations",[94,99],{"title":95,"path":96,"stem":97,"icon":98},"Housekeeping","\u002Foperations\u002Fhousekeeping","4.operations\u002F1.housekeeping","i-lucide-timer",{"title":100,"path":101,"stem":102,"icon":103},"Redrive and dead letters","\u002Foperations\u002Fredrive-and-dlq","4.operations\u002F2.redrive-and-dlq","i-lucide-rotate-ccw",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":35},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[110],{"title":111,"path":112,"stem":113,"icon":114},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F1.configuration","i-lucide-settings",{"id":116,"title":74,"body":117,"description":400,"extension":401,"links":402,"meta":403,"navigation":404,"path":75,"seo":405,"stem":76,"__hash__":406},"docs\u002F3.api\u002F3.worker-and-handlers.md",{"type":118,"value":119,"toc":395},"minimark",[120,125,265,277,281,287,316,320,339,391],[121,122,124],"h2",{"id":123},"task-registry","Task + registry",[126,127,132],"pre",{"className":128,"code":129,"language":130,"meta":131,"style":131},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from pydantic import BaseModel\nfrom taskq import Task, TaskRegistry\n\nclass Input(BaseModel):\n    n: int\n\nclass Output(BaseModel):\n    n: int\n\nasync def work(payload: Input) -> Output:\n    return Output(n=payload.n)\n\nTASK = Task(\n    name=\"demo.work\",\n    queue=\"demo\",\n    input_model=Input,\n    output_model=Output,\n    handler=work,\n    retry=5,  # bool | int | RetryStrategy\n)\n\nregistry = TaskRegistry((TASK,))\n","python","",[133,134,135,143,149,156,162,168,173,179,184,189,195,201,206,212,218,224,230,236,242,248,254,259],"code",{"__ignoreMap":131},[136,137,140],"span",{"class":138,"line":139},"line",1,[136,141,142],{},"from pydantic import BaseModel\n",[136,144,146],{"class":138,"line":145},2,[136,147,148],{},"from taskq import Task, TaskRegistry\n",[136,150,152],{"class":138,"line":151},3,[136,153,155],{"emptyLinePlaceholder":154},true,"\n",[136,157,159],{"class":138,"line":158},4,[136,160,161],{},"class Input(BaseModel):\n",[136,163,165],{"class":138,"line":164},5,[136,166,167],{},"    n: int\n",[136,169,171],{"class":138,"line":170},6,[136,172,155],{"emptyLinePlaceholder":154},[136,174,176],{"class":138,"line":175},7,[136,177,178],{},"class Output(BaseModel):\n",[136,180,182],{"class":138,"line":181},8,[136,183,167],{},[136,185,187],{"class":138,"line":186},9,[136,188,155],{"emptyLinePlaceholder":154},[136,190,192],{"class":138,"line":191},10,[136,193,194],{},"async def work(payload: Input) -> Output:\n",[136,196,198],{"class":138,"line":197},11,[136,199,200],{},"    return Output(n=payload.n)\n",[136,202,204],{"class":138,"line":203},12,[136,205,155],{"emptyLinePlaceholder":154},[136,207,209],{"class":138,"line":208},13,[136,210,211],{},"TASK = Task(\n",[136,213,215],{"class":138,"line":214},14,[136,216,217],{},"    name=\"demo.work\",\n",[136,219,221],{"class":138,"line":220},15,[136,222,223],{},"    queue=\"demo\",\n",[136,225,227],{"class":138,"line":226},16,[136,228,229],{},"    input_model=Input,\n",[136,231,233],{"class":138,"line":232},17,[136,234,235],{},"    output_model=Output,\n",[136,237,239],{"class":138,"line":238},18,[136,240,241],{},"    handler=work,\n",[136,243,245],{"class":138,"line":244},19,[136,246,247],{},"    retry=5,  # bool | int | RetryStrategy\n",[136,249,251],{"class":138,"line":250},20,[136,252,253],{},")\n",[136,255,257],{"class":138,"line":256},21,[136,258,155],{"emptyLinePlaceholder":154},[136,260,262],{"class":138,"line":261},22,[136,263,264],{},"registry = TaskRegistry((TASK,))\n",[266,267,268,269,272,273,276],"p",{},"Wire names match ",[133,270,271],{},"[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)*",". Queues match ",[133,274,275],{},"[a-z0-9_]{1,57}",".",[121,278,280],{"id":279},"jobcontext","JobContext",[266,282,283,284,286],{},"Two-argument handlers receive ",[133,285,280],{}," first:",[126,288,290],{"className":128,"code":289,"language":130,"meta":131,"style":131},"from taskq import Complete, JobContext\n\nasync def work(ctx: JobContext, payload: Input) -> Complete:\n    # ctx.job_id, ctx.attempt_id, cancellation token, …\n    return Complete(result={})\n",[133,291,292,297,301,306,311],{"__ignoreMap":131},[136,293,294],{"class":138,"line":139},[136,295,296],{},"from taskq import Complete, JobContext\n",[136,298,299],{"class":138,"line":145},[136,300,155],{"emptyLinePlaceholder":154},[136,302,303],{"class":138,"line":151},[136,304,305],{},"async def work(ctx: JobContext, payload: Input) -> Complete:\n",[136,307,308],{"class":138,"line":158},[136,309,310],{},"    # ctx.job_id, ctx.attempt_id, cancellation token, …\n",[136,312,313],{"class":138,"line":164},[136,314,315],{},"    return Complete(result={})\n",[121,317,319],{"id":318},"running-workers","Running workers",[266,321,322,323,326,327,330,331,334,335,338],{},"Prefer the CLI (",[133,324,325],{},"taskq worker --registry module:attr …","). Programmatically, build a ",[133,328,329],{},"WorkerService"," \u002F ",[133,332,333],{},"WorkerSupervisor"," with a transport + registry — see the package ",[133,336,337],{},"worker"," module and Stage-2 specs in the repo.",[340,341,342,354],"table",{},[343,344,345],"thead",{},[346,347,348,352],"tr",{},[349,350,351],"th",{},"Concern",[349,353,58],{},[355,356,357,373,382],"tbody",{},[346,358,359,363],{},[360,361,362],"td",{},"Env \u002F flags",[360,364,365,368,369,372],{},[133,366,367],{},"WorkerSettings"," (",[133,370,371],{},"TASKQ_*",")",[346,374,375,378],{},[360,376,377],{},"Process loop",[360,379,380],{},[133,381,329],{},[346,383,384,387],{},[360,385,386],{},"Fair poll + presence",[360,388,389],{},[133,390,333],{},[392,393,394],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":131,"searchDepth":139,"depth":145,"links":396},[397,398,399],{"id":123,"depth":145,"text":124},{"id":279,"depth":145,"text":280},{"id":318,"depth":145,"text":319},"Task registry, JobContext, and running workers.","md",null,{},{"icon":77},{"title":74,"description":400},"gV_HZaHZnOYYv3kFEw1EkkbkY9S3Lnh92NJtJdlcezw",[408,410],{"title":69,"path":70,"stem":71,"description":409,"icon":72,"children":-1},"How workers lease work and extend ownership.",{"title":79,"path":80,"stem":81,"description":411,"icon":82,"children":-1},"Optional FastAPI transport for no-DB-credential workers.",1784549300044]