Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何知道队列中的特定任务是否已完成?_Python_Multithreading - Fatal编程技术网

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

Python 如何知道队列中的特定任务是否已完成?,python,multithreading,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() d

我对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不需要同步,但在应用acquire和release lock时,myTask会同步运行a和b的实例


请提供建议。

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

如果您的
打印“Hai”
只需要在myTask完成后进行,您可以将其放入任务中,并让myTask在任务完成时将该任务放入队列。(如果你是一个CS理论类型的人,你可以认为这类似于连续传球风格)

如果您的
打印“Hai”
对多个任务有更详细的依赖性,您可能会考虑未来或承诺

您可以进入基于参与者的并发世界,在这种情况下,可能会有一个同步消息发送方法,它或多或少满足您的需要

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


要获得所需内容,最明智的一步可能是提供一个阻塞版本的Queue.put(),它执行条件变量的操作。确保您考虑是否要阻止,直到队列为空,或者直到您放在队列上的东西从队列中移除,或者直到您放在队列上的东西完成处理。然后确保实现了您在考虑时决定实现的东西。

为什么每个线程中都有一个队列?我现在已经修改了代码。a=Athread(“a.txt”)等待b=Athread(“b.txt”)是不合适的,因为它们对myTask方法的调用将在两个不同的文件上进行。因此,Athread(“a.txt”)将只被调用一次,对myTask的所有其他调用将进入队列。线程使用不多,但通常队列是全局的,包含要完成的任务。有一个线程池(线程队列),用于保存线程。线程管理器将循环,直到任务queu不为空-它将唤醒,从任务队列中提取任务,从线程池中提取线程。将任务分配给线程。入睡如果线程池中不存在线程,它将休眠并重试。线程本身——在执行并返回结果后,将自己添加到线程池中。线程将彼此独立工作,但在所有任务完成之前程序不会退出。我只是想知道,我从队列中获得的实际好处是什么。我觉得我可以通过python列表实现这一点。如果提供了方法queue.iscomplete(task)return bool,它可能会很有用。queue.put()线程安全吗?是list.append()?我不知道这两个问题的答案,但是如果第一个是肯定的,第二个是否定的,那么这就是一个好处。另一个好处在于性能:当您向一端添加内容并从另一端移除内容时,队列应该表现良好,但是如果您使用列表来完成这项工作,那么将需要大量复制(插入时向前移动所有现有元素,或删除时向后移动所有元素)。