python多线程--优先级队列(Queue)

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue模块中的常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False
  • Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当Queue.get(False)
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.put_nowait(item) 相当Queue.put(item, False)
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作
#coding=utf-8
#!/usr/bin/python

import Queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
    def run(self):
        print "Starting " + self.name
        process_data(self.name, self.q)
        print "Exiting " + self.name

def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1

# 创建新线程
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1

# 填充队列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()

# 等待队列清空
while not workQueue.empty():
    pass

# 通知线程是时候退出
exitFlag = 1

# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"
时间: 2024-11-19 13:39:42

python多线程--优先级队列(Queue)的相关文章

Python 多线程同步队列模型

Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫"同步队列"的模型. 具体来讲,有一个生产者(Dispatcher)一方面从语料中读入句子,并且存入队列中,一方面看有没有空闲的消费者(Segmentor),如果有,就把句子从队列中弹出并交给这个空闲的消费者处理. 然后消费者把处理完成的结果交给生产者输出,生产者要保证输出与输入顺序一致. 消费者是典型的threading,它需要看见生成者

Python多线程3:queue

queue模块实现了多生产者.多消费者队列.在多线程环境下,该队列能实现多个线程间安全的信息交换. queue模块介绍 模块实现了3种类型的队列,差别在于队列中条目检索的顺序不同. 在FIFO队列中.依照先进先出的顺序检索条目.在LIFO队列中,最后加入的条目最先检索到(操作类似一个栈).在优先级队列中,条目被保存为有序的(使用heapq模块)而且最小值的条目被最先检索. queue模块定义了以下的类和异常: class queue.Queue(maxsize=0) FIFO队列的构造器.max

python 多线程与队列

各位好,之前写了多线程,但是在实际的生产中,往往情况比较复杂,要处理一批任务(比如要处理列表中所有元素),这时候不可能创建很多的线程,线程过多反而不好,还会造成资源开销太大,这时候想到了队列. Queue队列 Queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列. Queue.Queue(maxsize) FIFO(先进先出队列) Queue.LifoQueue(maxsize) LIFO(先进后出队列) Queue.PriorityQueue(maxsize)

多线程利器-队列(queue)

import queue#队列有3中模式,先进先出,先进后出,优先级q = queue.Queue() #默认是先进先出 import queue #队列有3中模式,先进先出,先进后出,优先级 q = queue.Queue() #默认是先进先出 q.put(12) q.put('jack') q.put({'name':'ok'}) # while True: # data = q.get() # print(data) 原文地址:https://www.cnblogs.com/ajaxa/p

python多线程多队列(BeautifulSoup网络爬虫)

程序大概内容如下: 程序中设置两个队列分别为queue负责存放网址,out_queue负责存放网页的源代码. ThreadUrl线程负责将队列queue中网址的源代码urlopen,存放到out_queue队列中. DatamineThread线程负责使用BeautifulSoup模块从out_queue网页的源代码中提取出想要的内容并输出. 这只是一个基本的框架,可以根据需求继续扩展. 程序中有很详细的注释,如有有问题跪求指正啊. import Queue import threading i

利用python多线程和队列管理shell程序

首先来描述下环境,在机器上有很多个JAVA程序,我们在每个JAVA程序里都配置了一个启动|停止|重启的脚本 举个例子: 我们现在要同时运行这些脚本,来达到快速启动所有的JAVA程序,如果我们只用多线程的话,线程是不会返回消息给父进程,我们如何才能知道这些程序是启动成功了呢? 所以我们用到了队列来管理. """我试过gevent,但是会在command这里造成阻塞""" gevent代码如下  如果有朋友知道如何优化,请您告诉我 #!/usr/bi

Python多线程编程

原文 运行几个线程和同时运行几个不同的程序类似,它有以下好处: 一个进程内的多个线程和主线程分享相同的数据空间,比分开不同的过程更容易分享信息或者彼此通信. 线程有时叫做轻量化过程,而且他们不要求更多的内存开支:它们比过程便宜. 一个线程的顺序是:启动,执行和停止.有一个指令指针跟踪线程正在运行的上下文在哪里. 它可以被抢占(中断) 它能暂时被挂起(也叫做休眠),而别的线程在运行--这也叫做yielding(让步). 开始一个新线程: 要生成一个线程,需要调用在thread模块中方法如下: th

python多线程的实现方法总结

本篇文章介绍支持python多线程编程的模块及其使用方法,主要有thread,threading,Queue,multiprocessing等 关于多线程编程的适用环境以及和多进程编程的区别,可查看https://www.cnblogs.com/liushi-Oscar/p/9636051.html thread 模块 thread模块在官方的介绍中并不推荐使用,原因在于thread模块对进程的退出没有控制,只有较少的同步原语等,因此这里不花太多时间介绍了 其包含的功能可以使用更高级的threa

消息队列queue

一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程序占用,而使用多线程加 队列queue,我们就可以把消息发送到queue,而不用管对方怎么处理是否处理,同样对于服务端. 消息队列queue在多线程编程中是一个非常好用的模块. 1.1 几种不同的queue 先进先出:q1 = queue.Queue(maxsize= 0) # first in f