2012-02-08 230 views
3

多线程一个典型的生产者 - 消费者问题是在Python象下面这样解决:生产者/消费者,像蟒蛇

from queue import Queue 
job_queue = Queue(maxsize=10)  

def manager(): 
    while i_have_some_job_do: 
     job = get_data_from_somewhere() 
     job_queue.put(job) #blocks only if queue is currently full 

def worker(): 
    while True: 
     data = job_queue.get() # blocks until data available 
     #get things done 

但我有生产者的变体/消费者问题(而不是一个严格的说,所以让我称之为经理 - 工人):

经理将一些工作放在队列中,工人应该继续获得工作并做好工作。但是,当工作人员获得作业时,它不会将作业从队列中删除(与Queue.get()不同)。而且它是能够从队列中删除作业的管理员。

那么员工如何在不将工作从队列中移出的情况下获得工作?也许getput可以吗?

经理如何从队列中移除特定工作?

+0

更多关于读者作家。 – UmNyobe 2012-02-08 23:47:25

+0

这非常混乱。如果消费者线程不删除作业,如果有多个消费者线程,则会出现问题。即使只有一个消费者线程,也必须阻止其从队列中弹出另一个作业,直到管理器弹出前一个作业。您将不得不通知管理人员删除已完成的工作(您没有指出管理人员通常会等待什么,所以我不知道该怎么做),还要向经理提供一些信号以表明消费者是在继续之前等待。你真的不得不做这个讨厌的事情吗? – 2012-02-08 23:56:23

+0

@MartinJames这不是那么讨厌。只有一个消费者存在。工人不需要通知管理员任何事情。经理会以其他方式收到通知。我要找的东西可以让工作人员睡眠直到新工作来临。但python文件似乎暗示没有办法这样做。对不起,我英文很差。 – onemach 2012-02-09 12:59:42

回答

2

也许你的作品不能完全删除作业,但考虑让他们从原始队列移动到不同的“作业完成”队列。移动本身应该便宜且快速,然后管理员可以处理“完成任务”队列,移除它同意的元素并将其他移回到工作队列。