如何使用 Bluemix 重复 运行 一个 python 应用程序?
How to run a python app repeatedly using Bluemix?
Bluemix python 构建包运行良好 - 非常容易 cf push myapp --no-route
。到目前为止,还不错。
不过有个问题:
我想在 Bluemix 上定期 运行 它,就像我在本地系统上使用 cron
一样。
背景
该应用未编写为长运行宁任务。我只是 运行 它会定期从我为客户编写的多个网站收集数据,并在适当的时候通过电子邮件将结果发送给我。
当我 运行 它在 IBM Bluemix 上时,Bluemix 运行time 目前认为应用程序在退出时失败,需要立即重新启动。这当然不是我想要的。
有几个选项:
1) 如果你想在 Python 中完成它,你可以尝试像我在 this example 中那样做的事情。基本结构是这样的:
import schedule
import time
def job():
#put the task to execute here
def anotherJob():
#another task can be defined here
schedule.every(10).minutes.do(job)
schedule.every().day.at("10:30").do(anotherJob)
while True:
schedule.run_pending()
time.sleep(1)
2) Bluemix 已经发生变化,现在更好的方法是使用 OpenWhisk。它是 IBM 的 "serverless" 计算版本,它允许安排任务的执行或以事件驱动的方式执行。您可以将您的应用移至 Docker 容器中,并根据计划或由外部事件驱动来调用它。
在了解了 Openwhisk 的简单 trigger 之后,这变得异常简单; 行动; 规则模型。
所以我将我的 Python 应用程序完全迁移到 Openwhisk 而不是使用 Bluemix Python buildpack 或 Bluemix Docker 容器适合这项任务的简单需求。
我在下面包含了一个摘要。我写了一个更冗长的版本 here。
作为一个额外的好处,我能够删除大量我自己的代码,而是使用 Slack 进行通知。由于操作起来非常简单,因此我将其包含在这个答案中。
程序
Openwhisk Python 操作是 python 2.7.
文件 sitemonitor.py
:
def main(inDict):
inTimeout = inDict.get('timeout', '4')
// A few function calls omitted for brevity
if state.errorCount == 0:
return {'text': "All sites OK"}
else:
return { 'text' : state.slackMessage }
main
接受字典,returns 接受字典
设置作业
创建 sitemonitor
动作
timeout
是仅适用于我的应用程序的参数。
$ wsk action create sitemonitor sitemonitor.py # default timeout of 4 seconds
或在默认参数中为操作指定不同的超时时间
$ wsk action update sitemonitor sitemonitor.py --param timeout 2 # seconds
创建 Slack 包操作 monitorSlack
wsk package bind /whisk.system/slack monitorSlack \
--param url 'https://hooks.slack.com/services/...' \
--param username 'monitor-bot' \
--param channel '#general'
找到 Incoming Webhook URL from your Slack Team account
创建组合 monitor2slack
动作
$ wsk action create monitor2slack --sequence sitemonitor,monitorSlack/post
创建触发器
每隔一小时自动触发
$ wsk trigger create monitor2hrs \
--feed /whisk.system/alarms/alarm \
--param cron '0 0 */2 * * *'
$ wsk trigger fire monitor2hrs # fire manually to test
创建规则
$ wsk rule create monitorsites monitor2hrs monitor2slack
... Openwhisk 将完成剩下的工作。
参考资料
Slack dW Open
Team 中 #openwhisk
频道的人非常有帮助。
Bluemix python 构建包运行良好 - 非常容易 cf push myapp --no-route
。到目前为止,还不错。
不过有个问题:
我想在 Bluemix 上定期 运行 它,就像我在本地系统上使用 cron
一样。
背景
该应用未编写为长运行宁任务。我只是 运行 它会定期从我为客户编写的多个网站收集数据,并在适当的时候通过电子邮件将结果发送给我。
当我 运行 它在 IBM Bluemix 上时,Bluemix 运行time 目前认为应用程序在退出时失败,需要立即重新启动。这当然不是我想要的。
有几个选项:
1) 如果你想在 Python 中完成它,你可以尝试像我在 this example 中那样做的事情。基本结构是这样的:
import schedule
import time
def job():
#put the task to execute here
def anotherJob():
#another task can be defined here
schedule.every(10).minutes.do(job)
schedule.every().day.at("10:30").do(anotherJob)
while True:
schedule.run_pending()
time.sleep(1)
2) Bluemix 已经发生变化,现在更好的方法是使用 OpenWhisk。它是 IBM 的 "serverless" 计算版本,它允许安排任务的执行或以事件驱动的方式执行。您可以将您的应用移至 Docker 容器中,并根据计划或由外部事件驱动来调用它。
在了解了 Openwhisk 的简单 trigger 之后,这变得异常简单; 行动; 规则模型。
所以我将我的 Python 应用程序完全迁移到 Openwhisk 而不是使用 Bluemix Python buildpack 或 Bluemix Docker 容器适合这项任务的简单需求。
我在下面包含了一个摘要。我写了一个更冗长的版本 here。
作为一个额外的好处,我能够删除大量我自己的代码,而是使用 Slack 进行通知。由于操作起来非常简单,因此我将其包含在这个答案中。
程序
Openwhisk Python 操作是 python 2.7.
文件 sitemonitor.py
:
def main(inDict):
inTimeout = inDict.get('timeout', '4')
// A few function calls omitted for brevity
if state.errorCount == 0:
return {'text': "All sites OK"}
else:
return { 'text' : state.slackMessage }
main
接受字典,returns 接受字典
设置作业
创建 sitemonitor
动作
timeout
是仅适用于我的应用程序的参数。
$ wsk action create sitemonitor sitemonitor.py # default timeout of 4 seconds
或在默认参数中为操作指定不同的超时时间
$ wsk action update sitemonitor sitemonitor.py --param timeout 2 # seconds
创建 Slack 包操作 monitorSlack
wsk package bind /whisk.system/slack monitorSlack \
--param url 'https://hooks.slack.com/services/...' \
--param username 'monitor-bot' \
--param channel '#general'
找到 Incoming Webhook URL from your Slack Team account
创建组合 monitor2slack
动作
$ wsk action create monitor2slack --sequence sitemonitor,monitorSlack/post
创建触发器
每隔一小时自动触发
$ wsk trigger create monitor2hrs \
--feed /whisk.system/alarms/alarm \
--param cron '0 0 */2 * * *'
$ wsk trigger fire monitor2hrs # fire manually to test
创建规则
$ wsk rule create monitorsites monitor2hrs monitor2slack
... Openwhisk 将完成剩下的工作。
参考资料
Slack dW Open
Team 中 #openwhisk
频道的人非常有帮助。