【发布时间】:2012-08-03 15:41:07
【问题描述】:
我对 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 的两个实例同步运行。
请提供建议。
【问题讨论】:
-
为什么每个线程都有一个队列?
-
我现在已经修改了代码。 a=Athread("a.txt") 等待 b=AThread("b.txt") 是不合适的,因为他们对 myTask 方法的调用将在 2 个不同的文件上。因此 Athread("a.txt") 只会被调用一次,所有其他对 myTask 的调用都将进入队列。
-
不多使用线程,但通常队列是全局的,并保存要完成的任务。有一个线程池(线程队列)保存线程。线程管理器将循环直到任务队列不为空 - 它会唤醒,从 task_queue 中拉出一个任务,从线程池中拉出一个线程。将任务分配给线程。去睡觉。如果线程池中不存在线程,它将休眠并重试。线程本身 - 执行并返回结果后会将其自身添加到线程池中。线程将彼此独立工作,但在所有任务完成之前程序不会退出。
标签: python multithreading