我有一个插入queueStream的线程(此处未显示)和FlowController,如果队列不为空,则会从队列中弹出另一个线程。
我验证了数据已经使用addToQueue()中的调试代码正确插入队列
问题是,FlowController中的'if queueStream'语句总是将queueStream视为空,而是转到else语句。
我是Python的新手,我觉得我缺少某种简单的范围规则。我正在使用'global queueStream',但似乎没有做任何事情。
感谢您的帮助。
from stream import *
from textwrap import TextWrapper
import threading
import time
queueStream = []
class FlowController(threading.Thread):
def run(self):
global queueStream
while True:
if queueStream:
print 'Handling tweet'
self.handleNextTweet()
else:
print 'No tweets, sleep for 1 second'
time.sleep(1)
def handleNextTweet(self):
global queueStream
status = queueStream.pop(0)
print self.status_wrapper.fill(status.text)
print '\n %s %s via %s\n' % (status.author.screen_name, status.created_at, status.source)
def addToQueue(status):
print 'adding tweets to the queue'
queueStream.append(status)
#debug
if queueStream:
print 'queueStream is non-empty'
if __name__ == '__main__':
try:
runner = RunStream()
runner.start()
flow = FlowController()
flow.start()
except KeyboardInterrupt:
print '\nGoodbye!'
EDIT ::::::::::::
感谢您的帮助。 Queue文档很好,并帮助我编写更清晰的代码,因为get()函数阻塞(很酷!)。无论如何,它仍然没有解决我的问题,但我打印出queueStream实例,然后将它传递给FlowController,之后,他们有两个不同的内存位置。这就是为什么我相信FlowController中的队列中没有弹出任何内容。这是否意味着Python按值而不是通过引用传递queueStream?如果是这样,我该如何解决这个问题?
from stream import *
from textwrap import TextWrapper
from threading import Thread
from Queue import Queue
import time
class FlowController(Thread):
def __init__(self, queueStream):
Thread.__init__(self)
self.queueStream=queueStream
def run(self):
while True:
status = self.queueStream.get()
print self.status_wrapper.fill(status.text)
print '\n %s %s via %s\n' % (status.author.screen_name, status.created_at, status.source)
def addToQueue(status):
print 'adding tweets to the queue'
queueStream.put(status)
queueStream = Queue()
if __name__ == '__main__':
try:
runner = RunStream()
runner.start()
flow = FlowController(queueStream)
flow.start()
except KeyboardInterrupt:
print '\nGoodbye!'
答案 0 :(得分:1)
如果没有看到RunStream,很难调试此问题。 所以我试图想出一个可能会出现问题的简单RunStream。
我无法重现问题,但此代码似乎有效。 如果它确实有效且与RunStream足够相似,也许您可以将此代码与您自己的代码进行比较,以找出错误。
import threading
import time
import Queue
import sys
import random
class FlowController(threading.Thread):
def __init__(self,queueStream):
threading.Thread.__init__(self)
self.queueStream=queueStream
def run(self):
while True:
if not self.queueStream.empty():
print 'Handling tweet'
self.handleNextTweet()
else:
print 'No tweets, sleep for 1 second'
time.sleep(1)
def handleNextTweet(self):
status = self.queueStream.get()
print(status)
class RunStream(threading.Thread):
def __init__(self,queueStream):
threading.Thread.__init__(self)
self.queueStream=queueStream
def run(self):
i=0
while True:
addToQueue(self.queueStream,i)
i+=1
time.sleep(random.randint(0,2))
def addToQueue(queueStream,status):
print 'adding tweets to the queue'
queueStream.put(status)
if not queueStream.empty():
print 'queueStream is non-empty'
if __name__ == '__main__':
queueStream = Queue.Queue()
try:
runner = RunStream(queueStream)
runner.daemon=True
runner.start()
flow = FlowController(queueStream)
flow.daemon=True
flow.start()
time.sleep(100)
except KeyboardInterrupt:
pass
finally:
print('Bye!')
答案 1 :(得分:0)
我不是python专家,但我相信你必须在模块级函数中声明你的全局变量
def addToQueue(status):
global queueStream
print 'adding tweets to the queue'
queueStream.append(status)
#debug
if queueStream:
print 'queueStream is non-empty'