在Python中使用队列
我在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)