如何知道队列中的特定任务是否完整?

时间:2012-08-03 05:27:16

标签: python multithreading

我对python队列有疑问。

我编写了一个线程类,其run()方法执行队列。

  import threading
  import Queue

  def AThread(threading.Thread):
     def __init__(self,arg1):
         self.file_resource=arg1
         threading.Thread.__init__(self)
         self.queue=Queue.Queue()

     def __myTask(self):
         self.file_resource.write()
         ''' Method that will access a common resource
          Needs to be synchronized.
          Returns a Boolean based on the outcome
         '''

     def run():
         while True:
             cmd=self.queue.get()
             #cmd is actually a call to method
             exec("self.__"+cmd)
             self.queue.task_done()


 #The problem i have here is while invoking the thread
 a=AThread()
 a.queue.put("myTask()")
 print "Hai"

同一个AThread实例(a = AThread())会将任务从不同位置加载到队列中。

因此,底部的print语句应该等待通过上面的语句添加到队列中的任务并等待一个确定的时间段,并且还接收执行任务后返回的值。

有没有一种简单的方法来实现这一目标?我已经对此进行了大量搜索,请仔细阅读此代码并提供建议。

为什么python的获取和释放锁不在类的实例上。在上面提到的场景中,AThread的实例a和b不需要同步,但是当应用获取和释放锁时,myTask对a和b的两个实例同步运行。

请提供建议。

1 个答案:

答案 0 :(得分:0)

您可以采取多种方法,具体取决于问题的具体轮廓。

如果你的print "Hai"只需要在myTask完成后发生,你就可以把它放到一个任务中,并让myTask在完成时将该任务放在队列中。 (如果你是一个CS理论的人,你可以认为这类似于延续传递风格)。

如果您的print "Hai"对多项任务有更详细的依赖,您可能会考虑期货或承诺。

你可以迈出基于Actor的并发世界的一步,在这种情况下,可能会有一个同步消息发送方法,或多或少地做你想要的。

如果您不想使用期货或承诺,您可以通过引入条件变量手动实现类似的操作。在myTask启动之前设置条件变量并将其传递给myTask,然后等待它被清除。随着程序的增长,你必须非常小心,并不断重新考虑你的锁定策略,以确保它保持简单和易于理解 - 这是困难的并发错误的东西。

获得所需内容的最小明智的步骤可能是提供一个阻塞版本的Queue.put()来完成条件变量。确保在队列为空之前考虑是否要阻塞,或者直到从队列中删除放入队列的内容,或者直到您放入队列的内容已完成处理为止。然后确保在考虑时实施您决定实施的内容。