为了避免混淆,我编辑了这个问题:
one.py
import threading
count = 5
dev = threading.Thread(name='dev', target=dev,args=(workQueue,count,))
dev.setDaemon(True)
dev.start()
workQueue = Queue.Queue(10)
queueLock.acquire()
workQueue.put(word)
queueLock.release()
count = 3
time.sleep(2)
count = 5但我在这里的困惑是,我能够在线程之间放置和获取队列中的值,但在计数的情况下,它不会反映。
为什么会这样呢?
我在这里到底遗漏了什么?
class dev ( threading.Thread ):
def test(self):
while 1:
print count
print self.EPP_Obj
queueLock.acquire()
if not self.workQueue.empty():
data = self.workQueue.get()
print data
queueLock.release()
else:
queueLock.release()
def __init__(self, workQueue, EPP_Obj):
threading.Thread.__init__(self)
self.workQueue = workQueue
self.EPP_Obj = EPP_Obj发布于 2012-02-09 04:39:08
让我们从一个例子开始:
Thread子类:
import threading
class Dev(threading.Thread):
def __init__(self, workQueue, queueLock, count):
super(Dev, self).__init__() # super() will call Thread.__init__ for you
self.workQueue = workQueue
self.queueLock= queueLock
self.count = count
def run(self): # put inside run your loop
data = ''
while 1:
with self.queueLock:
if not self.workQueue.empty():
data = self.workQueue.get()
print data
print self.count
if data == 'quit':
breakwith语句是获取和释放锁的一种聪明方法,请看一下doc。
现在运行的代码如下:
import Queue
import time
work_q = Queue.Queue() # first create your "work object"
q_lock = threading.Lock()
count = 1
dev = Dev(work_q, q_lock, count) # after instantiate like this your Thread
dev.setDaemon(True)
dev.start()
time.sleep(1)
with q_lock:
work_q.put('word')
# word
# 1
time.sleep(1)
count = 10
with q_lock:
work_q.put('dog')
# dog
# 1
count = 'foo'
with q_lock:
work_q.put('quit')
# quit
# 1
dev.join() # This will prevent the main to exit
# while the dev thread is still running有了上面的代码,我们就有了一个清晰的例子,说明无论我们对count做什么,self.count都保持不变。
这种行为的原因是调用:
dev = Dev(work_q, q_lock, count)或
dev = Dev(work_q, q_lock, 1)都是一回事。
Arnold Moon向您展示了一种更改self.count的方法。将其调整为我们的示例:
class Dev(threading.Thread):
def __init__(self, workQueue, queueLock, count):
super(Dev, self).__init__()
self.workQueue = workQueue
self.queueLock= queueLock
self.count = count
def set_count(self, value):
self.count = value
def run(self):
data = ''
while 1:
with self.queueLock:
if not self.workQueue.empty():
data = self.workQueue.get()
print data
print self.count
if data == 'quit':
break在运行代码中调用set_count将更改self.count的值
time.sleep(1)
with q_lock:
work_q.put('word')
# word
# 1
time.sleep(1)
count = dev.count + 9
dev.set_count(count)
with q_lock:
work_q.put('dog')
# dog
# 10
count = 'foo'
with q_lock:
work_q.put('quit')
# quit
# 10
dev.join()我希望这能帮助你澄清一些疑问。
发布于 2012-02-08 17:37:22
我希望这能对你有所帮助。我想你不知道你需要用哪种方式。在python中有一些多线程的方法。我介绍了类的使用方法。你在下面的代码中运行。你会明白的。
main.py
import stringRepeater
import Queue
workqueue = Queue.Queue()
workqueue.put('test1')
workqueue.put('test2')
workqueue.put('test3')
th = stringRepeater.stringRepeater(workqueue,5)
th.start()
print '----daemon is on ----'
th.setCount(3)
workqueue.put('test4')
workqueue.put('test5')stringRepeater.py
import threading
class stringRepeater(threading.Thread):
def __init__(self, workQueue, count):
threading.Thread.__init__(self)
self.workQueue = workQueue
self.repeatCount = count
def run(self):
while True:
teststring = self.workQueue.get()
for i in range(self.repeatCount):
print teststring
def setCount(self, newcount):
self.repeatCount = newcounthttps://stackoverflow.com/questions/9190169
复制相似问题