# -*- coding: utf-8 -*-
# by dl
from threading import Thread
import requests
# 线程不安全的queue
# from collections import deque
# 线程安全的queue
from queue import Queue
# 多线程访问这个不安全
q = Queue()
# 消费者模型
class ConvertThread(Thread):
def __init__(self, queue):
# 调用父类构造器
Thread.__init__(self)
self.queue = queue
def run(self):
# 循环队列(处理消费者数据)
while True:
# 获取队列信息 返回的是元祖 然后用元组开包(拆开元组 分别获取参数)
sid, data = self.queue.get()
# 如果接受到-1则不再处理
if sid == -1: break;
#
if data:
print('处理中')
# 生产者模型
class DownLoadthread(Thread):
def __init__(self, sid, queue):
# 调用父类构造器
Thread.__init__(self)
self.sid = sid
self.url = 'url'
self.queue = queue
def download(self, url):
r = requests.get(url)
if r.ok:
return r.text
def run(self):
# 1 获取data
data = self.download(self.url)
# 2 data 放入队列
self.queue.put((self.sid, data))
print(self.sid, data)
# 创建下载线程池
dThreads = [DownLoadthread(i, q) for i in range(1, 11)]
cthread = ConvertThread(q)
# 开启所有下载线程
for t in dThreads:
t.start()
# 开启处理线程
cthread.start()
# 循环阻塞下载进程
for t in dThreads:
t.join()
# 所有下载完成后加上-1让转换进程退出
# put一个元组 用来终结处理线程
q.put((-1, None))