Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在生产者-消费者模式中等待和检索结果?_Python_Multithreading_Concurrency_Multiprocessing_Producer Consumer - Fatal编程技术网

Python 如何在生产者-消费者模式中等待和检索结果?

Python 如何在生产者-消费者模式中等待和检索结果?,python,multithreading,concurrency,multiprocessing,producer-consumer,Python,Multithreading,Concurrency,Multiprocessing,Producer Consumer,我有一个使用生产者-消费者模式的应用程序:多个生产者,一个消费者。这里需要注意的是,在提交任务后,在每个生产者内部,我希望等待并在同一生产者流程中检索结果: from multiprocessing import Process from queue import Queue def producer(queue, work_item): queue.put(work_item) # ??? How to wait for the work_item to be done,

我有一个使用生产者-消费者模式的应用程序:多个生产者,一个消费者。这里需要注意的是,在提交任务后,在每个生产者内部,我希望等待并在同一生产者流程中检索结果:

from multiprocessing import Process
from queue import Queue


def producer(queue, work_item):
    queue.put(work_item)

    # ??? How to wait for the work_item to be done, and get back the result of processing work_item???

    # "result" is the result of producer processing this item. I want to print the result "INSIDE THE PRODUCER PROCESS"
    print("the result of processing {} is {}".format(work_item, result))


def consumer(queue)    :
    while True:
        item = queue.get()
        # process the item
        result = process(item)
        # ??? How to pass this result back to producer???
        # processing done
        queue.task_done()


if __name__== "__main__":
    queue=Queue()
    p1 = Process(target=producer, args=(queue,1))
    p2 = Process(target=producer, args=(queue,2))
    p3 = Process(target=producer, args=(queue,3))

    c1 = Process(target=consumer, args=(queue,))

    p1.start()
    p2.start()
    p3.start()
    c1.start()
为什么我要将任务提交和结果检索放在同一个生产者中

因为在我的实际应用中:

  • 生产者可以是Flask web服务器中的web请求处理程序
  • 消费者可以是tensorflow图像分类器
  • 在每个web请求中,用户提交一个图像进行分类,但分类是一项耗时的任务,因此web请求处理程序(我的生产者)然后将此任务委托给tensorflow图像分类过程(我的消费者)来完成这项工作,但web请求处理程序必须等待结果,并将其传递给用户

    那个么,如何在生产者-消费者模式中等待和检索结果呢



    另外,我已经试过芹菜了。但在这里,我更感兴趣的是核心Python实现(或通用并发模式),如果有的话。

    我会使用一个事件来停止生产者,直到消费者再次可用为止。另外,我会限制队列的大小,以避免任务之间的结果混合。在您的示例中,它将如下所示(未测试)。然而,可能存在比赛条件的风险

    from multiprocessing import Process, Event
    from queue import Queue
    
    
    def producer(queue, work_item, yoursignal):
        # do stuff
        if yoursignal.is_set():
            yoursignal.clear() # block others
            queue.put(block=True)
            yoursignal.wait() # wait for signal to become True
            print("the result of processing {} is {}".format(work_item, result))
    
    
    def consumer(queue, yoursignal):
        while True:
            item = queue.get(block=True) # wait until something is available
            # process the item
            result = process(item)
            # ??? How to pass this result back to producer???
            # processing done
            queue.task_done()
            yoursignal.set()
    
    
    if __name__== "__main__":
        queue = Queue(1) # only one slot in the queue
        signal = Event()
        p1 = Process(target=producer, args=(queue,1, signal))
        p2 = Process(target=producer, args=(queue,2, signal))
        p3 = Process(target=producer, args=(queue,3, signal))
    
        c1 = Process(target=consumer, args=(queue, signal))
    
        p1.start()
        p2.start()
        p3.start()
        c1.start()
    

    使
    producer
    s实际将承诺放入队列中,并等待它们实现?@bipll
    promissions
    与asyncio promissions一样?那可能行得通。让我寻找一些最简单可行的例子,或者试着写一个来验证。让我建议一种替代方法。现在您基本上期望客户机等待(可能是无限期的)响应。如何立即向客户端返回一些作业标识符,然后将通知推送到客户端或让客户端在下次调用中询问结果?@freakish或让客户端向
    消费者传递另一个参数,这是一个在处理项目后调用的回调。