线程和信息传递–怎么

本教程将介绍线程和信息传递--如何的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

线程和信息传递--怎么 教程 第1张

问题描述

为了避免混淆,我编辑了问题:

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

推荐答案

让我们从一个例子开始:

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':
 break

with语句是获取和释放锁的智能方法,请查看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()

我希望这将帮助您澄清一些疑虑。

好了关于线程和信息传递--怎么的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。