Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions python/src/activities.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
from temporalio import activity


@activity.defn
async def sayName(name: str) -> str:
if name == "":
name = "anonymous human"
class Activities:
# If you wish to connect any dependencies (eg, database), add in here
# def __init__(self, db: DB):
# self.db = db

return f"Hello {name}!"
@activity.defn
async def sayName(self, name: str) -> str:
if name == "":
name = "anonymous human"

return f"Hello {name}!"
28 changes: 26 additions & 2 deletions python/src/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,49 @@
from temporalio.worker import Worker
from temporalio.envconfig import ClientConfigProfile
from workflows import HelloWorldWorkflow
from activities import sayName
from activities import Activities
import shared
import inspect


async def main():
default_profile = ClientConfigProfile.load()
connect_config = default_profile.to_client_connect_config()

client = await Client.connect(**connect_config)

# Register the activities - you may need to inject dependencies in here
activities = Activities()

worker = Worker(
client,
task_queue=shared.TASK_QUEUE_NAME,
workflows=[HelloWorldWorkflow],
activities=[sayName],
activities=find_activities(activities),
)

print("Worker started.")
await worker.run()


# ---- auto-discovery helper ----
_ACTIVITY_ATTR = "__temporal_activity_definition" # set by @activity.defn


def find_activities(obj):
"""Return a list of bound methods on `obj` that are Temporal activities."""
acts = []
for _, member in inspect.getmembers(obj):
if callable(member) and is_activity_callable(member):
acts.append(member) # bound method carries injected deps
return acts


def is_activity_callable(attr) -> bool:
# Works for functions and bound methods
func = attr.__func__ if inspect.ismethod(attr) else attr
return hasattr(func, _ACTIVITY_ATTR)


if __name__ == "__main__":
asyncio.run(main())
4 changes: 2 additions & 2 deletions python/src/workflows.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from datetime import timedelta
from temporalio import workflow
from activities import sayName
from activities import Activities


@workflow.defn
class HelloWorldWorkflow:
@workflow.run
async def run(self, name: str) -> str:
return await workflow.execute_activity(
sayName,
Activities.sayName,
name,
schedule_to_close_timeout=timedelta(seconds=10),
)
Loading