Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/firdaus/temporal-python-sdk
https://github.com/firdaus/temporal-python-sdk
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/firdaus/temporal-python-sdk
- Owner: firdaus
- License: mit
- Archived: true
- Created: 2020-07-14T15:12:56.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2023-07-05T21:03:36.000Z (12 months ago)
- Last Synced: 2024-05-10T06:03:11.113Z (about 2 months ago)
- Language: Python
- Size: 638 KB
- Stars: 95
- Watchers: 11
- Forks: 24
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Lists
- awesome-cadence-temporal-workflow - Python
README
----
NOTE: I'm no longer working on this SDK. I will be refocusing my efforts on downstream tools.
----# Unofficial Python SDK for the Temporal Workflow Engine
## Status
This should be considered EXPERIMENTAL at the moment. At the moment, all I can say is that the [test cases](https://gist.github.com/firdaus/4ec442f2c626122ad0c8d379a7ffd8bc) currently pass. I have not tested this for any real world use cases yet.
## Installation
```
pip install temporal-python-sdk
```
## Sample CodeSample code for using this library can be found in [Workflows in Python Using Temporal](https://onepointzero.app/workflows-in-python-using-temporal/).
## Hello World
```python
import asyncio
import logging
from datetime import timedeltafrom temporal.activity_method import activity_method
from temporal.workerfactory import WorkerFactory
from temporal.workflow import workflow_method, Workflow, WorkflowClientlogging.basicConfig(level=logging.INFO)
TASK_QUEUE = "HelloActivity-python-tq"
NAMESPACE = "default"# Activities Interface
class GreetingActivities:
@activity_method(task_queue=TASK_QUEUE, schedule_to_close_timeout=timedelta(seconds=1000))
async def compose_greeting(self, greeting: str, name: str) -> str:
raise NotImplementedError# Activities Implementation
class GreetingActivitiesImpl:
async def compose_greeting(self, greeting: str, name: str):
return greeting + " " + name + "!"# Workflow Interface
class GreetingWorkflow:
@workflow_method(task_queue=TASK_QUEUE)
async def get_greeting(self, name: str) -> str:
raise NotImplementedError# Workflow Implementation
class GreetingWorkflowImpl(GreetingWorkflow):def __init__(self):
self.greeting_activities: GreetingActivities = Workflow.new_activity_stub(GreetingActivities)
passasync def get_greeting(self, name):
return await self.greeting_activities.compose_greeting("Hello", name)async def client_main():
client = WorkflowClient.new_client(namespace=NAMESPACE)factory = WorkerFactory(client, NAMESPACE)
worker = factory.new_worker(TASK_QUEUE)
worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities")
worker.register_workflow_implementation_type(GreetingWorkflowImpl)
factory.start()greeting_workflow: GreetingWorkflow = client.new_workflow_stub(GreetingWorkflow)
result = await greeting_workflow.get_greeting("Python")
print(result)
print("Stopping workers.....")
await worker.stop()
print("Workers stopped......")if __name__ == '__main__':
asyncio.run(client_main())
```## Roadmap
1.0
- [x] Workflow argument passing and return values
- [x] Activity invocation
- [x] Activity heartbeat and Activity.getHeartbeatDetails()
- [x] doNotCompleteOnReturn
- [x] ActivityCompletionClient
- [x] complete
- [x] complete_exceptionally
- [x] Activity get_namespace(), get_task_token() get_workflow_execution()
- [x] Activity Retry
- [x] Activity Failure Exceptions
- [x] workflow_execution_timeout / workflow_run_timeout / workflow_task_timeout
- [x] Workflow exceptions
- [x] Cron workflows
- [x] Workflow static methods:
- [x] await_till()
- [x] sleep()
- [x] current_time_millis()
- [x] now()
- [x] random_uuid()
- [x] new_random()
- [x] get_workflow_id()
- [x] get_run_id()
- [x] get_version()
- [x] get_logger()
- [x] Activity invocation parameters
- [x] Query method
- [x] Signal methods
- [x] Workflow start parameters - workflow_id etc...
- [x] Workflow client - starting workflows synchronously
- [x] Workflow client - starting workflows asynchronously (WorkflowClient.start)
- [x] Get workflow result after async execution (client.wait_for_close)
- [x] Workflow client - invoking signals
- [x] Workflow client - invoking queries1.1
- [x] ActivityStub and Workflow.newUntypedActivityStub
- [x] Remove threading, use coroutines for everything all concurrency
- [x] Classes as arguments and return values to/from activity and workflow methods (DataConverter)
- [x] Type hints for DataConverter
- [x] Parallel activity execution (STATUS: there's a working but not finalized API).1.2
- [x] Timers
- [x] Custom workflow ids through start() and new_workflow_stub()Other:
- [ ] WorkflowStub and WorkflowClient.newUntypedWorkflowStub
- [ ] ContinueAsNew
- [ ] Sticky workflows
- [ ] Child Workflows
- [ ] Support for keyword arguments
- [ ] Compatibility with Java client
- [ ] Compatibility with Golang client
- [ ] Upgrade python-betterproto
- [ ] sideEffect/mutableSideEffect
- [ ] Local activity
- [ ] Cancellation Scopes
- [ ] Explicit activity ids for activity invocations