我对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的两个实例。在
请提供建议。在
根据问题的具体情况,你可以采取很多方法。在
如果您的
print "Hai"
只需要在myTask完成后发生,您可以将它放入一个任务中,并在任务完成后让myTask将该任务放入队列中。(如果你是一个CS理论的人,你可以认为这是类似于连续传球的风格)。在如果您的
print "Hai"
对多个任务有更详细的依赖性,那么您可以考虑未来或承诺。在您可以进入基于参与者的并发世界,在这种情况下,可能会有一个同步消息发送方法来或多或少地执行您想要的操作。在
如果您不想使用futures或promises,您可以通过引入一个条件变量来手动实现类似的功能。在myTask开始之前设置条件变量并将其传递给myTask,然后等待它被清除。随着程序的发展,您必须非常小心,并不断地重新考虑您的锁定策略,以确保它保持简单易懂—这正是造成复杂并发错误的原因。在
要获得所需内容,最明智的一步可能是提供队列.put()它做条件变量的事情。确保您考虑是否要阻塞,直到队列为空,或者直到您放入队列的东西从队列中移除,或者直到您放入队列的对象完成处理。然后确保你实现了你在思考时决定要实现的东西。在
相关问题 更多 >
编程相关推荐