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

2024-09-28 17:03:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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的acquire和release锁不在类的实例上。在前面提到的场景中,AThread的实例a和实例b不需要同步,但是在应用acquire和release锁时,myTask会同步运行a和b的两个实例。在

请提供建议。在


Tags: 实例方法runimportselfcmd队列queue
1条回答
网友
1楼 · 发布于 2024-09-28 17:03:31

根据问题的具体情况,你可以采取很多方法。在

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

如果您的print "Hai"对多个任务有更详细的依赖性,那么您可以考虑未来或承诺。在

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

如果您不想使用futures或promises,您可以通过引入一个条件变量来手动实现类似的功能。在myTask开始之前设置条件变量并将其传递给myTask,然后等待它被清除。随着程序的发展,您必须非常小心,并不断地重新考虑您的锁定策略,以确保它保持简单易懂—这正是造成复杂并发错误的原因。在

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

相关问题 更多 >