2010-11-04 169 views
0

任何人都可以提供关于如何实现下面的场景?python:如何让线程等待特定的响应?

2队列 - 目标队列,响应队列从目标队列
线程拾取任务了
发现需要更多的细节
提交新的任务目标队列
等待他的请求被处理,结果出现在响应队列

监视响应队列的响应他的任务,但实际上没有选择任何响应,因此它可用于其他线程等待其他响应?

谢谢

回答

1

如果一个线程等待一个特定的任务完成,也就是说,它不应该选择除了一个它把所有完成的任务,你可以使用锁来等待任务:

 
    def run(self): 
    # get a task, do somethings, put a new task 
    newTask.waitFor() 
    ...

class Task: ... def waitFor(self): self._lock.acquire()

def complete(self): self._lock.release()

def failedToComplete(self, err): self._error = err self._lock.release()

这将有助于避免time.sleep() -s响应队列监视。应该在这里考虑任务完成错误处理。但这是不常见的方法。它是一些特定的算法,其中放置一个新任务的线程应该等待它吗?即便如此,您可以将该逻辑实施到Task类中,而不是在处理它的线程中。为什么线程从目标队列中选择一个任务并将新任务返回到目标队列?如果你有n个步骤的处理,你可以使用n个队列。一组线程服务第一个队列,获取任务,处理它,将结果(新任务)放到下一个队列中。最终响应处理程序线程组获取响应并将其发送回客户端。这些任务封装了关于他们自己的细节,这些线程不会将任务与另一个区分开来。而且不需要等待特定的任务。

+0

让我给出更多细节。有2对目标队列和响应队列,以及2组线程。一个负责检索数据和其他过程数据,但可能存在来自处理组的线程可能需要更多数据才能完成其任务的情况。所以,它将请求放到数据目标队列中,并且必须得到正确的响应,否则它将无法正确处理它。对数据源的访问必须受到限制,因此处理线程无法自行获取其他数据。是否有意义? – m1k3y3 2010-11-04 11:55:22

+0

@ m1k3y02是的,它的确如此,谢谢。在这种情况下,您应该实现一些'waitFor'方法,该方法会锁定并等待数据,处理线程在将任务返回到目标队列后应调用该方法。虽然我不清楚为什么不将处理分为两步:1.获取任务,执行某些操作,如果需要额外的数据,则将其放入数据收集队列,否则返回响应。 2.另一个线程监视datagatheringqueue,处理任务,并将它们放入responsequeue。但你可能知道原因。 – khachik 2010-11-04 12:03:35

+0

实际上我在考虑打开1个线程来执行1个任务,另一方面可能更合理。谢谢 :-) – m1k3y3 2010-11-04 12:07:38