#coding=utf-8
'''
读取文件速度较慢,但是可以在后台一直读取提高效率。
并且只读取接下来的几个文件,节约内存。
'''
import queue
import threading
import time
import os
from PIL import Image
dirs=r''
que=queue.Queue(5)
# 生产者
def gen(que):
for i in os.listdir(dirs):
f=os.path.join(dirs,i)
img=Image.open(f)
# 如果满了,就会等着可以插入的时候在插入
#print('gen',i)
que.put(img)
ge=threading.Thread(target=gen,args=(que,))
ge.start()
#消费者
while not que.empty():
print(que.get())
time.sleep(0.001)
from multiprocessing import Process,JoinableQueue
import time,random
def consumer(q):
while True:
time.sleep(random.randint(1,5))
res=q.get()
# 如果这个时候出现了错误怎么,
print('消费者拿到了 %s' %res)
q.task_done()# get和task_done 必须成对出现,个数相等。
def producer(seq,q):
for item in seq:
time.sleep(random.randrange(1,2))
q.put(item)
print('生产者做好了 %s' %item)
q.join()# 保证每个项目都被调用了task_done
if __name__ == '__main__':
q=JoinableQueue()
seq=('包子%s' %i for i in range(10))
p=Process(target=consumer,args=(q,))
p.daemon=True #设置为守护进程,在主线程停止时p也停止,但是不用担心,producer内调用q.join保证了consumer已经处理完队列中的所有元素
p.start()
producer(seq,q)
print('主线程')
网友评论