Python 如何知道队列中的特定任务是否已完成?
我对python队列有疑问 我编写了一个线程类,其run()方法执行队列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
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()?我不知道这两个问题的答案,但是如果第一个是肯定的,第二个是否定的,那么这就是一个好处。另一个好处在于性能:当您向一端添加内容并从另一端移除内容时,队列应该表现良好,但是如果您使用列表来完成这项工作,那么将需要大量复制(插入时向前移动所有现有元素,或删除时向后移动所有元素)。