在我的python-flask
网络应用程序在端口5001
运行时,我有一个方案来创建一个端点,其中所有其他端点视图函数需要并行执行,然后汇总所有单独的响应以返回它在相同的请求生命周期中。
例如,
routes
应用中的flask
包含以下view
个功能
@app.route(/amazon)
def amazon():
return "amazon"
@app.route(/flipkart)
def flipkart():
return "flipkart"
@app.route(/snapdeal)
def sd():
return "snapdeal"
注意:在上述三个端点中,涉及的重要数量network io
我正在创建另一个端点,其中所有其他端点实现都必须在此集体调用。
### This is my endpoint
@app.route(/all)
def do_all():
# execute all amazon, flipkart, snapdeal implementations
我建议针对上述情况采用两种方法。
将worker任务编写为单独的函数,通过python-multiprocessing模块调用每个调用者并收集响应
def do_all():
def worker(name):
# doing network io task for the given source name
pass
for name in ['amazon', 'flipkart', 'snapdeal']:
p = multiprocessing.Process(target=worker, args=(name,))
jobs.append(p)
p.start()
# Terminating all the process explicitly, Since freezing after execution complete
for j in jobs:
j.terminate()
return 200
这里我调用每个子进程,调用worker,最后显式终止所有子进程,因为它也是wsgi threads
我认为的。
使用python-grequests显式调用每个端点。因此,驻留在同一应用程序中的每个端点将被称为并行,并收集响应
def do_all():
grequests.post("http://localhost:5001/amazon", data={})
grequests.post("http://localhost:5001/flipkart", data={})
grequests.post("http://localhost:5001/snapdeal", data={})
这将通过为每个请求生成的每个wsgi threads
执行,在这里我不知道生成的多个进程并且在执行后没有终止?
两者都可能是类似的,但哪一个可以无缝实施,如果有任何替代方式来解决这种情况,请帮助我?为什么?
答案 0 :(得分:0)
也许你可以使用另一种方法来简化它:
立即回复用户
def do_all():
return 'amazon, ... being processed'
让调用的背景方法发送signals
from blinker import Namespace
background = Namespace()
amazon_finished = background.signal('amazon-finished')
def amazon_bg():
amazon_finished.send(**interesting)
订阅后台工作人员的信号。
def do_all():
amazon_finished.connect(amazon_logic)
向用户显示后台工作人员的返回值。这将是一个新的请求(可能在同一路线上)。
def amazon_logic(sender, **extra):
sender
优点是用户对每个请求都有立即响应后台工作人员的状态,错误处理会更容易。
我还没有测试过,所以你应该自己查看blinker API。