我在python中使用猎鹰框架来形成web api的json响应。
例如,我有一个名为logic()
的函数,工作时间为30-90分钟。我想要这样写:
- 当http-client请求/api/somepath。Json我们称之为
somepath_handle()
-
somepath_handle()
在其他线程/进程中运行logic()
- 当
logic()
完成时,线程被关闭 -
somepath_handle()
从return中读取logic()
的响应 - 如果
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