在Python中使用队列

25 投票
5 回答
95639 浏览
提问于 2025-04-17 14:03

我在Eclipse里(用PyDev)运行下面的代码时,总是出现错误:

q = queue.Queue(maxsize=0) NameError: global name 'queue' is not defined

我查了文档,感觉这样写应该没问题。是不是我漏掉了什么?是PyDev的原因吗?还是代码里有什么问题?谢谢大家的帮助。

from queue import *

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

def main():

    q = queue.Queue(maxsize=0)
    for i in range(num_worker_threads):
         t = Thread(target=worker)
         t.daemon = True
         t.start()

    for item in source():
        q.put(item)

    q.join()       # block until all tasks are done

main()

使用的环境: Eclipse SDK

版本:3.8.1 构建编号:M20120914-1540

以及Python 3.3

5 个回答

1

如果你使用 from queue import * 这行代码,意思是你把这个模块里的所有类和函数都引入到你的代码里了。这样你就不需要写模块的名字,直接可以用 q = Queue(maxsize=100) 来创建一个队列。但是,如果你想用带模块名的类,比如 q = queue.Queue(maxsize=100),你就得写另一行引入代码:import queue。这意味着你把整个模块都引入了,包括里面的所有函数,而不仅仅是第一种情况的那些函数。

7

这是因为你使用了:from queue import *

然后你试图使用:

queue.Queue(maxsize=0) 

去掉queue这个部分,因为from queue import *会把所有的属性都导入到当前的命名空间里。

Queue(maxsize=0) 

或者可以用import queue来代替from queue import *

27

你这样做

from queue import *

这行代码已经把queue模块里的所有类都导入进来了。你可以把那行改成

q = Queue(maxsize=0)

注意:“使用通配符导入(从 import *)应该避免,因为这样会让命名空间里有哪些名字变得不清楚,容易让读者和很多自动化工具感到困惑。”Python PEP-8

作为另一种选择,你可以使用:

from queue import Queue

q = Queue(maxsize=0)

撰写回答