我在python中使用falcon框架来形成Web API的json响应。
例如,我有一个函数logic()
,该函数在30-90分钟内有效。我想要这样的东西:
somepath_handle()
somepath_handle()
logic()
在另一个线程/进程中运行logic()
完成后,线程被关闭somepath_handle()
读取logic()
来自return的响应somepath_handle()
在logic()
完成之前被杀死,则logic()
直到完成的线程/ etc才会停止代码:
def somepath_handle():
run_async_logic()
response=wait_for_async_logic_response() # read response of logic()
return_response(response)
我正在使用一个简单的工作程序来创建我正在处理一些命令的队列。如果添加简单的响应存储,则有可能处理任何请求,并且在连接断开时不会丢失请求。
示例:使用falconframework.org响应请求的主要功能。
main.py:
from flow import Flow
import falcon
import threading
import storage
__version__ = 0.1
__author__ = '[email protected]'
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句