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()
为什么我要将任务提交和结果检索放在同一个生产者中
因为在我的实际应用中:
另外,我已经试过芹菜了。但在这里,我更感兴趣的是核心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实际将承诺放入队列中,并等待它们实现?@bipllpromissions
与asyncio promissions一样?那可能行得通。让我寻找一些最简单可行的例子,或者试着写一个来验证。让我建议一种替代方法。现在您基本上期望客户机等待(可能是无限期的)响应。如何立即向客户端返回一些作业标识符,然后将通知推送到客户端或让客户端在下次调用中询问结果?@freakish或让客户端向消费者传递另一个参数,这是一个在处理项目后调用的回调。