1 队列的种类
Python queue模块的FIFO队列先进先出。 class queue.Queue(maxsize) LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize) 还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)
import queue
queue_obj = queue. Queue( )
for i in range ( 3 ) :
queue_obj. put( i)
for i in range ( 3 ) :
print ( queue_obj. get( ) )
"""执行结果
0
1
2
"""
queue_obj = queue. LifoQueue( )
for i in range ( 3 ) :
queue_obj. put( i)
for i in range ( 3 ) :
print ( queue_obj. get( ) )
"""执行结果
2
1
0
"""
import Queue
import threading
class Job ( object ) :
def __init__ ( self, priority, description) :
self. priority = priority
self. description = description
print 'Job:' , description
return
def __cmp__ ( self, other) :
return cmp ( self. priority, other. priority)
q = Queue. PriorityQueue( )
q. put( Job( 3 , 'level 3 job' ) )
q. put( Job( 10 , 'level 10 job' ) )
q. put( Job( 1 , 'level 1 job' ) )
def process_job ( q) :
while True :
next_job = q. get( )
print 'for:' , next_job. description
q. task_done( )
workers = [ threading. Thread( target= process_job, args= ( q, ) ) ,
threading. Thread( target= process_job, args= ( q, ) )
]
for w in workers:
w. setDaemon( True )
w. start( )
q. join( )
2 队列函数
maxsize = 10
queue_obj = queue. Queue( maxsize)
queue_obj. get( block= True , timeout= None )
queue_obj. get_nowait( )
queue_obj. put( item= "待插入的元素" , block= True , timeout= None )
queue_obj. put_nowait( '待插入的元素' )
queue_obj. empty( )
queue_obj. full( )
queue_obj. task_done( )
queue_obj. join( )
"""下面的例子验证toask_done和join的关系"""
for i in range ( 3 ) :
queue_obj. put( i)
queue_obj. get( )
queue_obj. task_done( )
queue_obj. get( )
queue_obj. task_done( )
queue_obj. get( )
queue_obj. task_done( )
queue_obj. join( )
print ( '直至队列中的所有元素全部都被取出, join函数才不会阻塞, 如果只执行了两次task_done函数, 则join会一直阻塞' )