Python的Queue模块提供一种适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,所以多个线程能够共用同一个Queue实例。Queue的大小(元素的个数)可用来限制内存的使用。html
Queue
类实现了一个基本的先进先出(FIFO)
容器,使用put()
将元素添加到序列尾端,get()
从队列尾部移除元素。python
与标准FIFO实现Queue
不一样的是,LifoQueue
使用后进先出序(会关联一个栈数据结构)。编程
除了按元素入列顺序外,有时须要根据队列中元素的特性来决定元素的处理顺序。例如,财务部门的打印任务可能比码农的代码打印任务优先级更高。PriorityQueue
依据队列中内容的排序顺序(sort order)来决定那个元素将被检索。安全
# coding: utf-8 from queue import Queue # Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 def test_queue(): q=Queue(10) for i in range(5): q.put(i) while not q.empty(): print(q.get()) def test_LifoQueue(): import queue # queue.LifoQueue() #后进先出->堆栈 q = queue.LifoQueue(3) q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get()) print(q.get()) def test_PriorityQueue(): import queue # queue.PriorityQueue() #优先级 q = queue.PriorityQueue(3) # 优先级,优先级用数字表示,数字越小优先级越高 q.put((10, 'a')) q.put((-1, 'b')) q.put((100, 'c')) print(q.get()) print(q.get()) print(q.get()) # Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,可是不够规范 from queue import Queue # Queue在3.x中改为了queue import random import threading import time from threading import Thread class Producer(threading.Thread): """ Producer thread 制做线程 """ def __init__(self, t_name, queue): # 传入线程名、实例化队列 threading.Thread.__init__(self, name=t_name) # t_name便是threadName self.data = queue """ run方法 和start方法: 它们都是从Thread继承而来的,run()方法将在线程开启后执行, 能够把相关的逻辑写到run方法中(一般把run方法称为活动[Activity]); start()方法用于启动线程。 """ def run(self): for i in range(5): # 生成0-4五条队列 print("%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), i)) # 当前时间t生成编号d并加入队列 self.data.put(i) # 写入队列编号 time.sleep(random.randrange(10) / 5) # 随机休息一会 print("%s: %s producing finished!" % (time.ctime(), self.getName)) # 编号d队列完成制做 class Consumer(threading.Thread): """ Consumer thread 消费线程,感受来源于COOKBOOK """ def __init__(self, t_name, queue): threading.Thread.__init__(self, name=t_name) self.data = queue def run(self): for i in range(5): val = self.data.get() print("%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val)) # 编号d队列已经被消费 time.sleep(random.randrange(10)) print("%s: %s consuming finished!" % (time.ctime(), self.getName())) # 编号d队列完成消费 def main(): """ Main thread 主线程 """ queue = Queue() # 队列实例化 producer = Producer('Pro.', queue) # 调用对象,并传如参数线程名、实例化队列 consumer = Consumer('Con.', queue) # 同上,在制造的同时进行消费 producer.start() # 开始制造 consumer.start() # 开始消费 """ join()的做用是,在子线程完成运行以前,这个子线程的父线程将一直被阻塞。 join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。 """ producer.join() consumer.join() print('All threads terminate!') if __name__=="__main__": test_queue() print("=====后进先出=====") test_LifoQueue() print("=====优先级======") test_PriorityQueue() main()
- 多线程主要的内容:直接进行多线程操做,线程同步,带队列的多线程;数据结构
Python3 经过两个标准库 _thread 和 threading 提供对线程的支持。多线程
_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能仍是比较有限的。并发
threading 模块除了包含 _thread 模块中的全部方法外,还提供的其余方法:app
除了使用方法外,线程模块一样提供了Thread类来处理线程,Thread类提供了如下方法:dom
#queue 多线程各个线程的运算的值放到一个队列中,到主线程的时候再拿出来,以此来代替 #return的功能,由于在线程是不能返回一个值的
# https://www.cnblogs.com/zephyr-1/p/6043785.html import time import threading from Queue import Queue def job(l,q): q.put([i**2 for i in l]) def multithreading(data): q = Queue() threads = [] for i in xrange(4): t = threading.Thread(target = job,args = (data[i],q)) t.start() threads.append(t) for thread in threads: thread.join() results = [] for _ in range(4): results.append(q.get()) print results if __name__ == "__main__": data = [[1,2,3],[4,5,6],[3,4,3],[5,5,5]] multithreading(data) [[1, 4, 9], [16, 25, 36], [9, 16, 9], [25, 25, 25]]