Flask内部如何做平行执行

2024-06-26 01:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的python-flaskweb应用程序运行于端口5001时,我有一个场景,即创建一个端点,其中所有其他端点视图函数都需要并行执行,然后聚合所有单独的响应,以便在同一请求生命周期中返回它。在

例如, routesflask应用程序中包含以下view函数

@app.route(/amazon)
def amazon():
   return "amazon"

@app.route(/flipkart)
def flipkart():
   return "flipkart"

@app.route(/snapdeal)
def sd():
   return "snapdeal"

注意:在上述三个端点中,涉及大量network io

我正在创建另一个端点,在这里所有其他端点实现都必须被调用,即使在这里也是如此。在

^{pr2}$

对于上述情况,我建议两种方法。在

方法1(多处理方法):

将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。在

方法2(grequests):

使用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为每个请求生成wsgi threads来执行,这里我不知道在执行后会产生多个进程并且不会终止吗?在

两个都可以是相似的,但是哪一个是无缝实现的,如果有任何替代方法来解决这个场景,请帮助我?为什么?在


Tags: 方法函数nameappamazonforreturndef
1条回答
网友
1楼 · 发布于 2024-06-26 01:41:15

也许你可以用另一种方法简化它:

  1. 立即向用户返回响应

    def do_all(): return 'amazon, ... being processed'

  2. 在后台调用所有相关的方法。在
  3. 让调用的后台方法发送signals

    {/cd2}

  4. 订阅来自后台工作人员的信号。在

    def do_all(): amazon_finished.connect(amazon_logic)

  5. 向用户显示后台工作者的返回值。这将是一个新的请求(可能在同一个路径中)。在

    def amazon_logic(sender, **extra): sender

优点是用户可以对每个请求立即响应后台工作人员的状态,错误处理会容易得多。在

我还没有测试过,所以你应该自己查找blinker API。在

相关问题 更多 >