Python 需要boto3和SWF示例
亚马逊正在推动boto3的未来发展,但没有为新的boto3提供足够的文档Python 需要boto3和SWF示例,python,amazon-swf,boto3,Python,Amazon Swf,Boto3,亚马逊正在推动boto3的未来发展,但没有为新的boto3提供足够的文档 是否有人有任何将SWF与boto3结合使用的示例代码愿意与大家分享?这是我迄今为止发现的唯一示例: 因此,流程概述如下所示(请注意,这是直接从上面的链接中提取的,但是添加了一些额外的注释和更多的流程) 值得注意的是,SWF是根据事物的名称运作的。这取决于您的代码如何赋予这些名称执行的含义。例如,您的决策者将轮询并使用任务名称决定下一步是什么 有些事情我不是很确定任务列表我认为引用是一种名称空间。这并不是一系列的事情,更多
是否有人有任何将SWF与boto3结合使用的示例代码愿意与大家分享?这是我迄今为止发现的唯一示例: 因此,流程概述如下所示(请注意,这是直接从上面的链接中提取的,但是添加了一些额外的注释和更多的流程) 值得注意的是,SWF是根据事物的名称运作的。这取决于您的代码如何赋予这些名称执行的含义。例如,您的
决策者将轮询并使用任务名称决定下一步是什么
有些事情我不是很确定<代码>任务列表
我认为引用是一种名称空间。这并不是一系列的事情,更多的是通过名字来隔离事情。现在我可能完全错了,从我的基本理解来看,这就是我认为它所说的
你可以在任何地方管理你的决策者和员工。因为他们接触AWS,如果你的防火墙允许0.0.0.0/0出口,你就可以访问
AWS文档还提到可以运行lambda,但我还没有发现如何触发它
创建boto3 swf客户端:
创建域
注册工作流后,我们现在可以开始分配任务
将任务分配给工作流。
您可以分配任务。请记住,这些主要是字符串,您的代码将赋予它们执行意义
try:
swf.register_activity_type(
domain=DOMAIN,
name="DoSomething",
version=VERSION, # string
description="This is a worker that does something",
defaultTaskStartToCloseTimeout="NONE",
defaultTaskList={"name": TASKLIST } # TASKLIST is a string
)
print "Worker created!"
except ClientError as e:
print "Activity already exists: ", e.response.get("Error", {}).get("Code")
发送并启动工作流
创建域、工作流和任务后,我们现在可以开始工作流了
import boto3
swf = boto3.client('swf')
response = swf.start_workflow_execution(
domain=DOMAIN # string,
workflowId='test-1001',
workflowType={
"name": WORKFLOW,# string
"version": VERSION # string
},
taskList={
'name': TASKLIST
},
input=''
)
print "Workflow requested: ", response
注意workflowId
,这是一个自定义标识符,例如str(uuid.uuid4())
。从文档中:
与工作流执行关联的用户定义标识符。您可以使用此选项将自定义标识符与工作流执行关联。如果工作流执行在逻辑上是先前执行的重新启动,则可以指定相同的标识符。不能同时使用同一workflowId执行两个打开的工作流
此时,不会发生任何事情,因为我们没有运行决策器
,也没有任何工作者
。让我们看看那些是什么样子
决策者
我们的决策者将进行投票,以获得一项决策任务,以便就以下事项做出决策:
import boto3
from botocore.client import Config
import uuid
botoConfig = Config(connect_timeout=50, read_timeout=70)
swf = boto3.client('swf', config=botoConfig)
注意上面的超时设置。您可以参考此PR以了解其背后的基本原理:
从Boto3 SWF文件:
工作人员应将其客户端套接字超时设置为至少70秒(比服务可能保留轮询请求的最长时间高10秒)
正是公关让boto3能够实现这一功能
请注意,在这段代码的末尾,我们检查是否完成了ActivityTaskCompleted
,并用决策CompleteWorkflowExecution
来响应,让SWF知道我们已经完成了
那是决策者,工人长什么样
工人
再次注意,我们设置了read\u超时
import boto3
from botocore.client import Config
botoConfig = Config(connect_timeout=50, read_timeout=70)
swf = boto3.client('swf', config=botoConfig)
现在我们开始工人投票:
print "Listening for Worker Tasks"
while True:
task = swf.poll_for_activity_task(
domain=DOMAIN,# string
taskList={'name': TASKLIST}, # TASKLIST is a string
identity='worker-1') # identity is for our history
if 'taskToken' not in task:
print "Poll timed out, no new task. Repoll"
else:
print "New task arrived"
swf.respond_activity_task_completed(
taskToken=task['taskToken'],
result='success'
)
print "Task Done"
我们再次向SWF发出信号,表示我们已经完成了我们的工作。官方文件的链接位于[此处][1] 有很多代码示例,只需跟随链接或[此][2]即可。在available service部分中,它列出了boto3现在支持的所有服务以及详细示例 例如: boto3并获取SWF的执行计数
import boto3
import datetime
import time
import dateutil.tz
def lambda_handler(event,context):
swfClient = boto3.client('swf')
currentTimeZone = dateutil.tz.gettz('Australia/Brisbane')
latestDate = datetime.datetime.now(tz=currentTimeZone)
oldestDate = latestDate - datetime.timedelta(1)
fullTextPreloadResponse = swfClient.count_open_workflow_executions(
domain=domainName,
startTimeFilter={
'oldestDate': oldestDate,
'latestDate': latestDate
},
typeFilter={
'name': 'NAME_OF_YOUR_SWF_WORKFLOW_NAME',
'version': 'VERSION_NUMBER'
}
)
print("the count is " + str(fullTextResponse['count']))
print(fullTextResponse)
这就是我在我的案例中用来获取正在运行的SWF工作流类型计数的内容。我使用的格式在上面提到的文档中有很好的定义
为了简单地同时使用boto3和SWF,首先在python lambda函数中导入boto3。然后添加python日期时间。然后一个boto3.client设置我们可以使用的客户机|与SWF交互
其他例子包括:
history = swf.get_workflow_execution_history(
domain= domainName,
execution={
'workflowId': workflowId,
'runId': runId
},
)
希望这个能帮助你!
[1]:
[2] :你找到了吗?虽然这从理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。完全明白为什么,我现在正在编辑它,从链接中删除相关部分并添加一些注释。现在的答案非常全面。国防部应该删除缺少信息的否决票。它什么也不做,只是确认任务已经完成。流程是:Notify SWF to start->SWF Notifys your decider->decider决定安排活动任务:
ScheduleActivityTask
,或者它结束工作流:CompleteWorkflowExecution
。如果它安排了一个任务,那么worker将收到带有工作流历史记录的请求。在本例中,它只是说“我完成了”立即响应\u活动\u任务\u完成
。将其返回决策器,然后决策器将CompleteWorkflowExecution
发送给SWF。作为一个包装器,Pypi上有更多内容。添加一些示例和解释比复制URL要好。@mate00谢谢您的反馈。我已经更新了我的答案。干杯
import boto3
from botocore.client import Config
botoConfig = Config(connect_timeout=50, read_timeout=70)
swf = boto3.client('swf', config=botoConfig)
print "Listening for Worker Tasks"
while True:
task = swf.poll_for_activity_task(
domain=DOMAIN,# string
taskList={'name': TASKLIST}, # TASKLIST is a string
identity='worker-1') # identity is for our history
if 'taskToken' not in task:
print "Poll timed out, no new task. Repoll"
else:
print "New task arrived"
swf.respond_activity_task_completed(
taskToken=task['taskToken'],
result='success'
)
print "Task Done"
import boto3
import datetime
import time
import dateutil.tz
def lambda_handler(event,context):
swfClient = boto3.client('swf')
currentTimeZone = dateutil.tz.gettz('Australia/Brisbane')
latestDate = datetime.datetime.now(tz=currentTimeZone)
oldestDate = latestDate - datetime.timedelta(1)
fullTextPreloadResponse = swfClient.count_open_workflow_executions(
domain=domainName,
startTimeFilter={
'oldestDate': oldestDate,
'latestDate': latestDate
},
typeFilter={
'name': 'NAME_OF_YOUR_SWF_WORKFLOW_NAME',
'version': 'VERSION_NUMBER'
}
)
print("the count is " + str(fullTextResponse['count']))
print(fullTextResponse)
history = swf.get_workflow_execution_history(
domain= domainName,
execution={
'workflowId': workflowId,
'runId': runId
},
)