Python范围和线程问题

2024-04-27 03:54:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个线程插入到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!'

编辑:::::::::::

谢谢你到目前为止的帮助。队列文档很不错,自从get()函数块之后,它帮助我编写了更干净的代码(酷!)。我仍然没有解决我的队列问题,但在两个不同的流控制器之前,我还是把它打印出来了。这就是为什么我相信在FlowController中没有从队列中弹出任何内容。这是否意味着Python通过值而不是引用传递queueStream?如果是这样的话,我该怎么办?在

^{pr2}$

Tags: 代码importselfif队列defstatus语句
2条回答

我不是python专家,但我相信即使在模块级函数中也必须声明全局变量


def addToQueue(status):
    global queueStream
    print 'adding tweets to the queue'
    queueStream.append(status)

    #debug
    if queueStream:
        print 'queueStream is non-empty'

在没有看到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!')

相关问题 更多 >