Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要boto3和SWF示例_Python_Amazon Swf_Boto3 - Fatal编程技术网

Python 需要boto3和SWF示例

Python 需要boto3和SWF示例,python,amazon-swf,boto3,Python,Amazon Swf,Boto3,亚马逊正在推动boto3的未来发展,但没有为新的boto3提供足够的文档 是否有人有任何将SWF与boto3结合使用的示例代码愿意与大家分享?这是我迄今为止发现的唯一示例: 因此,流程概述如下所示(请注意,这是直接从上面的链接中提取的,但是添加了一些额外的注释和更多的流程) 值得注意的是,SWF是根据事物的名称运作的。这取决于您的代码如何赋予这些名称执行的含义。例如,您的决策者将轮询并使用任务名称决定下一步是什么 有些事情我不是很确定任务列表我认为引用是一种名称空间。这并不是一系列的事情,更多

亚马逊正在推动boto3的未来发展,但没有为新的boto3提供足够的文档


是否有人有任何将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
            },
        )