我想实现slack slash命令,该命令必须处理fucntion pipeline
,大约需要30秒才能处理。现在,因为Slack斜杠命令只允许3秒响应,所以如何实现这一点。我提到this但不知道如何实现它。
请跟我说。我是第一次这样做。
这就是我尝试过的。我知道如何在3秒内回复ok status
,但我不明白如何再次致电pipeline
import requests
import json
from bottle import route, run, request
from S3_download import s3_download
from index import main_func
@route('/action')
def action():
pipeline()
return "ok"
def pipeline():
s3_download()
p = main_func()
print (p)
if __name__ == "__main__":
run(host='0.0.0.0', port=8082, debug=True)
我遇到了this文章。使用AWS lambda是唯一的解决方案吗? 我们不能在python中完全做到这一点吗?
答案 0 :(得分:2)
这样的事情:
from boto import sqs
@route('/action', method='POST')
def action():
#retrieving all the required request example
params = request.forms.get('response_url')
sqs_queue = get_sqs_connection(queue_name)
message_object = sqs.message.Message()
message_object.set_body(params)
mail_queue.write(message_object)
return "request under process"
你可以有另一个进程来处理队列并调用长时间运行的函数:
sqs_queue = get_sqs_connection(queue_name)
for sqs_msg in sqs_queue.get_messages(10, wait_time_seconds=5):
processed_msg = json.loads(sqs_msg.get_body())
response = pipeline(processed_msg)
if response:
sqs_queue.delete_message(sqs_msg)
你可以在diff独立python文件中运行第二个进程,作为守护进程或cron。
我在这里使用sqs Amazon Queue,但有不同的选项。
答案 1 :(得分:0)
你可以在一个过程中选择一两个选项,但它充满了危险。如果你启动一个新的Thread
来处理漫长的过程,你最终可能会在中间部署或崩溃而失去它。
如果持久性对您很重要,请查看后台任务工作程序,如SQS,Lambda,甚至是使用Redis支持的Celery任务队列。一个单独的任务有一些有趣的失败模式,这些工具将帮助你更好地处理它们而不仅仅是产生一个线程。