Intro: Fault-Oblivious Stateful Python Code
cadence-python allows you to create Python functions that have their state (local variables etc..) implicitly saved such that if the process/machine fails the state of the function is not lost and can resume from where it left off.
This programming model is useful whenever you need to ensure that a function runs to completion. For example:
- Business logic involving multiple micro services
- CI/CD pipelines
- Data pipelines
- RPA
- ETL
- Marketing automation / Customer journeys / Customer engagement
- Zapier/IFTTT like end user automation.
- Chat bots
- Multi-step forms
- Scheduler/Cron jobs
Behind the scenes, cadence-python uses Cadence as its backend.
For more information about the fault-oblivious programming model refer to the Cadence documentation here
Install Cadencce
wget https://raw.githubusercontent.com/uber/cadence/master/docker/docker-compose.yml
docker-compose up
Register sample domain
docker run --network=host --rm ubercadence/cli:master --do sample domain register -rd 1
Installation cadence-python
pip install cadence-client==1.0.1
Hello World Sample
import sys
import logging
from cadence.activity_method import activity_method
from cadence.workerfactory import WorkerFactory
from cadence.workflow import workflow_method, Workflow, WorkflowClient
logging.basicConfig(level=logging.DEBUG)
TASK_LIST = "HelloActivity-python-tasklist"
DOMAIN = "sample"
# Activities Interface
class GreetingActivities:
@activity_method(task_list=TASK_LIST, schedule_to_close_timeout_seconds=2)
def compose_greeting(self, greeting: str, name: str) -> str:
raise NotImplementedError
# Activities Implementation
class GreetingActivitiesImpl:
def compose_greeting(self, greeting: str, name: str):
return f"{greeting} {name}!"
# Workflow Interface
class GreetingWorkflow:
@workflow_method(execution_start_to_close_timeout_seconds=10, task_list=TASK_LIST)
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)
async def get_greeting(self, name):
# Place any Python code here that you want to ensure is executed to completion.
# Note: code in workflow functions must be deterministic so that the same code paths
# are ran during replay.
return await self.greeting_activities.compose_greeting("Hello", name)
if __name__ == '__main__':
factory = WorkerFactory("localhost", 7933, DOMAIN)
worker = factory.new_worker(TASK_LIST)
worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities")
worker.register_workflow_implementation_type(GreetingWorkflowImpl)
factory.start()
client = WorkflowClient.new_client(domain=DOMAIN)
greeting_workflow: GreetingWorkflow = client.new_workflow_stub(GreetingWorkflow)
result = greeting_workflow.get_greeting("Python")
print(result)
print("Stopping workers....")
worker.stop()
print("Workers stopped...")
sys.exit(0)
Status / TODO
cadence-python is still under going heavy development. It should be considered EXPERIMENTAL at the moment. A production
version is targeted to be released in September of 2019 January 2020 March 2020 April 2020.
1.0
- Tchannel implementation
- Python-friendly wrapper around Cadence's Thrift API
- Author activities in Python
- Start workflows (synchronously)
- Create workflows
- Workflow execution in coroutines
- Invoke activities from workflows
- ActivityCompletionClient heartbeat, complete, complete_exceptionally
- Activity heartbeat, getHeartbeatDetails and doNotCompleteOnReturn
- Activity retry
- Activity getDomain(), getTaskToken(), getWorkflowExecution()
- Signals
- Queries
- Async workflow execution
- await
- now (currentTimeMillis)
- Sleep
- Loggers
- newRandom
- UUID
- Workflow Versioning
- WorkflowClient.newWorkflowStub(Class workflowInterface, String workflowId);
1.1
- ActivityStub and Workflow.newUntypedActivityStub
- Classes as arguments and return values to/from activity and workflow methods
- WorkflowStub and WorkflowClient.newUntypedWorkflowStub
- Custom workflow ids through start() and new_workflow_stub()
- ContinueAsNew
- Compatibility with Java client
- Compatibility with Golang client
2.0
- Sticky workflows
Post 2.0:
- sideEffect/mutableSideEffect
- Local activity
- Parallel activity execution
- Timers
- Cancellation Scopes
- Child Workflows
- Explicit activity ids for activity invocations
Metadata
Release files for cadence-client 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cadence-client-1.0.1.tar.gz | 53.9 kB | Without provenance | Details for cadence-client-1.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cadence_client-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for cadence_client-1.0.1-py3-none-any.whl |
Total release size: 114.7 kB
Release files / cadence-client-1.0.1.tar.gz
| Download URL | cadence-client-1.0.1.tar.gz |
|---|---|
| Size | 53.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
77a1ba8f0c21a900e29fe5e8079adfff6991633465cf9f822e163d1f15dba795
|
|
BLAKE2b-256 checksum How to use checksums |
c223eb6d6275cf13c37f5284b4618bf42c18cd0d8370655e3b23dda330a8228c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.5
|
Release files / cadence_client-1.0.1-py3-none-any.whl
| Download URL | cadence_client-1.0.1-py3-none-any.whl |
|---|---|
| Size | 60.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
294989f48e7e868c6ca5b4bea5290b8bee05e864e365e82c9c783b72d634ebaf
|
|
BLAKE2b-256 checksum How to use checksums |
b9a0b32de069f03b942783fae8051083d2799bac0d0aba38c31e465935d1bef8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.5
|
Security for cadence-client 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.