0

我对 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 的两个实例同步运行。

请提供建议。

4

1 回答 1

0

您可以采取很多方法,具体取决于您的问题的具体情况。

如果您print "Hai"只需要在 myTask 完成后发生,您可以将其放入任务中,并让 myTask 在完成时将该任务放入队列中。(如果您是 CS 理论类的人,您可以认为这类似于 continuation-passing 风格)。

如果您print "Hai"对多个任务有更复杂的依赖,您可能会研究期货或承诺。

您可以进入基于 Actor 的并发世界,在这种情况下,可能会有一个同步消息发送方法或多或少地执行您想要的操作。

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

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

于 2012-08-03T06:19:05.490 回答