如何在http客户端关闭连接时存储响应



我在python中使用猎鹰框架来形成web api的json响应。

例如,我有一个名为logic()的函数,工作时间为30-90分钟。我想要这样写:

  1. 当http-client请求/api/somepath。Json我们称之为somepath_handle()
  2. somepath_handle()在其他线程/进程中运行logic()
  3. logic()完成时,线程被关闭
  4. somepath_handle()从return中读取logic()的响应
  5. 如果somepath_handle()logic()完成之前被杀死,那么具有logic()的线程/etc在完成之前不会停止

代码:

def somepath_handle():
    run_async_logic()
    response=wait_for_async_logic_response() # read response of logic()
    return_response(response)

如果您的过程需要很长时间,我建议您使用电子邮件或实时通知系统将结果发送给用户?

我使用一个简单的worker来创建我正在处理一些命令的队列。如果添加简单的响应存储,那么就有可能处理任何请求,并且在连接丢失时不会丢失它们。

的例子:它的主要功能是使用falconframework.org来响应请求。

main.py:

from flow import Flow
import falcon
import threading
import storage
__version__ = 0.1
__author__ = 'weldpua2008@gmail.com'

app = falcon.API(
    media_type='application/json')
app.add_route('/flow', Flow())
THREADS_COUNT = 1
# adding the workers to process queue of command
worker = storage.worker
for _ in xrange(THREADS_COUNT):
    thread = threading.Thread(target=worker)
    thread.daemon = True
    thread.start()

它是带有工作代码的简单存储storage.py:

from Queue import Queue
import subprocess
import logging
main_queque = Queue()
def worker():
    global main_roles_queque
    while True:
        try:
            cmd = main_queque.get()
            #do_work(item)
            #time.sleep(5)
            handler = subprocess.Popen(
            cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
            stdout, stderr = handler.communicate()
            logging.critical("[queue_worker]: stdout:%s, stderr:%s, cmd:%s" %(stdout, stderr, cmd))
            main_queque.task_done()
        except Exception as error:
            logging.critical("[queue_worker:error] %s" %(error))

这个类将处理任何请求[POST, GET]flow.py:

import storage
import json
import falcon
import random
class Flow(object):
    def on_get(self, req, resp):
        storage_value = storage.main_queque.qsize()
        msg = {"qsize": storage_value}
        resp.body = json.dumps(msg, sort_keys=True, indent=4)
        resp.status = falcon.HTTP_200
    #curl -H "Content-Type: application/json" -d '{}'  http://10.206.102.81:8888/flow
    def on_post(self, req, resp):
        r = random.randint(1, 10000000000000)
        cmd = 'sleep 1;echo "ss %s"' % str(r)
        storage.main_queque.put(cmd)
        storage_value = cmd
        msg = {"value": storage_value}
        resp.body = json.dumps(msg, sort_keys=True, indent=4)
        resp.status = falcon.HTTP_200

相关内容

  • 没有找到相关文章

最新更新