多线程 队列读取同一个文件

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

常用方法:

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.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
Queue.join() 实际上意味着等到队列为空,再执行别的操作

import threading
import queue

def file_queue():
    global q
    import xlrd
    wb = xlrd.open_workbook("./haha.xls")
    ws = wb.sheet_by_name("Sheet1")
    for i in range(ws.nrows):
        q.put(ws.row_values(i))

def work():
    global q
    for i in range(7):
        print(threading.currentThread().name)
        if q.qsize() == 0:
            continue
        print(q.get())

def func():
    work()
q = queue.LifoQueue(maxsize=30)
list1 = []
file_queue()
for i in range(5):
    thread1 = threading.Thread(target=func)
    list1.append(thread1)
for i in list1:
    i.start()
for i in list1:
    i.join()

猜你喜欢

转载自blog.csdn.net/weixin_45131345/article/details/106896125