Python多重处理:通知作业完成而无需通过队列传递事件对象

时间:2018-10-18 16:05:46

标签: python flask multiprocessing

问题概述

我有一个python flask服务器,其中的一个端点要完成少量工作(实际代码读取,调整大小并返回图像)。我想优化端点,以便可以并行调用多次。

我当前拥有的代码(如下所示)不起作用,因为它依赖于通过$feedbacks = getFeedbacks(); if(count($feedbacks)>0){ foreach($feedbacks as $feedback){ $getData($feedback->order_id); } } function getData($orderId) { $orderId = $orderId; $api = "api address here"; $curl = curl_init($api); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $curl_response = curl_exec($curl); $json = json_decode($curl_response); } 传递multiprocessing.Event对象,这是不允许的,并导致以下错误:

multiprocessing.JoinableQueue

如何使用单独的过程来计算一些作业,并在完成特定作业后通知主线程?


概念证明

烧瓶可以是多线程的,因此,如果一个请求正在等待结果,则其他线程可以继续处理其他请求。我在这里有一个基本的概念证明,表明可以使用多重处理来优化并行请求:https://github.com/alanbacon/flask_multiprocessing

github上的示例代码为我理解的每个请求都产生了一个新过程,该过程具有相当大的开销,另外,我注意到如果有10个或20个以上的并发请求,我的概念验证服务器就会崩溃,我怀疑这是因为产生了太多的进程。


当前尝试

我试图创建一组从队列中挑选作业的工人。作业完成后,结果将写入共享存储区。每个作业都包含要完成的工作和一个RuntimeError: Condition objects should only be shared between processes through inheritance 对象,可以在作业完成时设置该对象以向主线程发出信号。

每个请求线程通过一个带有新创建的Event对象的作业,然后立即等待该事件再返回结果。在一个服务器请求线程正在等待时,服务器可以使用其他线程继续服务其他请求。

如上所述,问题是Event对象无法以这种方式传递。

我应该采取什么方法来解决这个问题?

Event

0 个答案:

没有答案