The sleep() primitive pauses a workflow for a specified duration. Unlike traditional sleep that blocks a thread, PyWorkflow’s sleep suspends the workflow completely - no resources are consumed during the sleep period.
Copy
from pyworkflow import workflow, sleep@workflow()async def reminder_sequence(user_id: str): await send_reminder(user_id, "First reminder") # Workflow suspends here - zero resources used await sleep("1d") # Resumes automatically after 1 day await send_reminder(user_id, "Second reminder") await sleep("7d") await send_reminder(user_id, "Final reminder")
from datetime import datetime# Sleep until a specific datetimeawait sleep(datetime(2025, 12, 25, 9, 0, 0))# Sleep until next Monday at 9 AMnext_monday = get_next_monday()await sleep(next_monday.replace(hour=9, minute=0))
# BAD: This holds a worker for 24 hours!import asyncioasync def traditional_sleep(): await do_something() await asyncio.sleep(86400) # Blocks worker for 24h await do_something_else()
PyWorkflow’s sleep releases the worker:
Copy
# GOOD: Worker is freed during sleepfrom pyworkflow import sleep@workflow()async def efficient_sleep(): await do_something() await sleep("24h") # Worker freed, resumes later await do_something_else()
With 100 workflows each sleeping for 1 day, traditional sleep would need 100 workers blocked for 24 hours. PyWorkflow needs 0 workers during the sleep period.
@workflow()async def batch_api_calls(items: list): for i, item in enumerate(items): await call_api(item) # Rate limit: 10 calls per minute if (i + 1) % 10 == 0: await sleep("1m")