队列,线程池,视图


队列

# 创建队列(可以指定长度),把任务往池里放,扔是一个线程,取是一个线程,下面代码里的数字是任务数
from random import randint
from queue import Queue
from threading import Thread
?
my_q = Queue(10)  # 容量 maxsize 队列大小(队列长度)
def f(my_que):                      f是放,f1是取 如果是for i in range(100):,就     for i in range(10):             10个10个放,用完这10个再放10个    
       num = randint(0,1000)
       my_que.put(num)    #put是放
        print("添加数据{}".format(num))
def f1(my_que):
   for j in range(5):
       num = my_que.get()  #取
       print(num)
       print("f1提取到的数据{}".format(num))
def f2(my_que):
   for k in range(5):        #如果取的大于池子里的,它就不会结束,一直卡在那
       num = my_que.get()  #取
       print(num)
       print("f2提取到的数据{}".format(num))
t0 = Thread(target=f,args=(my_q,))  #元组(my_q,)
t1 = Thread(target=f1,args=(my_q,))   #子线程
t2 = Thread(target=f2,args=(my_q,))
t0.start()
t1.start()
t2.start()
t0.join()
t1.join()
t2.join()
:
添加数据485
添加数据343
添加数据358
添加数据439
添加数据332
添加数据702
添加数据117
添加数据346
添加数据89
添加数据69
485
f1提取到的数据485
343
f1提取到的数据343
358
f1提取到的数据358
439
f1提取到的数据439
332
f1提取到的数据332
702
f2提取到的数据702
117
f2提取到的数据117
346
f2提取到的数据346
89
f2提取到的数据89
69
f2提取到的数据69
?
my_q.put()   # 添加任务
?
my_q.qsize() # 判断队列中还有几个任务没有被取走
print(my_q.qsize())
2
?
my_q.get()   # 取任务
?
my_q.empty() # 是否为空
?
my_q.full()  # 是否为满
?
生产者 消费者模式 场景
一个只负责生产  一个负责只消费   好处:实现解耦
Apache是世界使用排名第一的Web服务器软件
nginx 是一个高性能的HTTP和反向代理web服务器
?
lifoQueue后进先出的队列
priorityQueue优先级队列
引用方式与上面一样

线程池

更好的利用多线程 出现池 从而提高利用率 可以方便的管理线程,也可以减少内存的消耗。
?
主线程  给任务
子线程  处理任务
?
线程池里面有线程     任务队列里面有任务
一个任务用一个线程进行装载
------------------------------------------------------------------------
?
?
from queue import Queue
from threading import Thread
import time
?
class TheradPool(object):
   '''
  创建指定数量的线程池,线程池是自己创建的
  '''
   def __init__(self,n):   #n是线程的数量
       self.q = Queue()    #放任务的队列
       for i in range(n):   #循环创建线程
           Thread(target=self.worker,daemon=True).start()  #开启线程
               #worker是取,因为下文worker是取,daemon=True是设置守护线程
?
   def worker(self):   #取任务来执行
       while True:     #死循环,一直取
           func= self.q.get()   #取出任务
           func()   #执行函数
           self.q.task_done()  #执行完毕   如果去掉的话就不会结束,一直等待
?
   def put_q(self, func):  #放任务
       self.q.put(func)
?
   def join_q(self):   #阻塞
       self.q.join()
?
def task1():
   print('1go....')
   time.sleep(3)
   print('1end....')
?
def task2():
   print('2go....')
   time.sleep(3)
   print('2end....')
?
def task3():
   print('3go....')
   time.sleep(3)
   print('3end....')
   
if __name__ == '__main__':
   pool = TheradPool(2)  #创建两个线程进入阻塞,等待任务(实例化,传n)
   pool.put_q(task1)  #发布任务
   pool.put_q(task2)  #发布任务
   pool.put_q(task3)  #发布任务
   print('完成')
   pool.join_q()    #阻塞
   print('都OK')
:
完成1go....
2go....
#三秒
1end....
3go....
2end....
#三秒
3end....
都OK
----------------------------
#如果去掉阻塞,且守护线程为False:
完成1go....2go....
?
都OK
?
1end....2end....
一直等下去不会结束,我们叫僵尸线程或者孤儿线程
------------------------------------------------------------------------------
#带参数的线程池
以task1为例
from queue import Queue
from threading import Thread
import time
?
class TheradPool(object):
   '''
  创建指定数量的线程池,线程池是自己创建的
  '''
   def __init__(self,n):   #n是线程的数量
       self.q = Queue()    #放任务的队列
       for i in range(n):   #循环创建线程
           Thread(target=self.worker,daemon=True).start()  #开启线程
                  #worker是取,因为下文worker是取,daemon=True是设置守护线程
   
   def worker(self):   #取任务来执行
       while True:     #死循环,一直取
           func,args,kwargs= self.q.get()   #取出任务
           func(*args,**kwargs)   #执行函数
           self.q.task_done()  #执行完毕   如果去掉的话就不会结束,一直等待
   
   def put_q(self, func,*args,**kwargs):  #放任务
       self.q.put((func,args,kwargs))
   
   def join_q(self):   #阻塞
       self.q.join()
?
def task1(*args,**kwargs): #####func(*args,**kwargs)相当于task1(*args,**kwargs)
   print('1go....')
   print('============',args,kwargs)
   time.sleep(3)
   print('1end....')
?
def task2():
   print('2go....')
   time.sleep(3)
   print('2end....')
?
def task3():
   print('3go....')
   time.sleep(3)
   print('3end....')
   
if __name__ == '__main__':
   pool = TheradPool(2)  #创建两个线程进入阻塞,等待任务(实例化,传n)
   pool.put_q(task1,1,2,4,a='hello',b='world')  #发布任务
   pool.put_q(task2)  #发布任务
   pool.put_q(task3)  #发布任务
   print('完成')
   pool.join_q()    #阻塞
   print('都OK')
:
完成
1go....
2go....
============ (1, 2, 4) {'a': 'hello', 'b': 'world'}
#三秒
1end....2end....
3go....
#三秒
3end....
都OK
?
"""
讲一下*args
"""
def func(*args):#*args位置参数
   print(args)
   print(*args)
func(1,2,3,[1234],'hello')
:
(1, 2, 3, [1234], 'hello')
1 2 3 [1234] hello
---------------------
def func(**args): #两个*必须传入键值对不过这种的不标准,一般是用**kwargs
   print(args)
   print(*args)
func(a='hello',b='world')
:
{'a': 'hello', 'b': 'world'}
a b
?
?

升级带参数的线程池

内置线程池

from multiprocessing.pool import ThreadPool  #已定义好的线程池,内置线程池
import time
?
def task1():
   print('1go....')
   time.sleep(3)
   print('1end....')
?
def task2():
   print('2go....')
   time.sleep(3)
   print('2end....')
?
?
if __name__ == '__main__':
   pool = ThreadPool(2)
   pool.apply_async(task1)  #放任务
   pool.apply_async(task2)
   print('提交完成')
   pool.close()     # 一定要关闭提交,给他一个信号现在已经提交
   pool.join()
   pool.terminate()  #强制终止子线程,主线程执行完的前提下,用的少
   print('完成了')

视图

###虚拟表不能增删改
定义:一张虚拟的表,不占空间,不占内存,用于保存复杂命令出来的数据,以后想用的话就不用输入那么麻烦的命令
?
创建:create view 视图名字 as select语句
?
查看:与以前的查看方式一样
?
删除:drop view 视图名字
?
比如这个表:
select students.number,students.name,grades.grade,subjects.title from grades,subjects,students where subjects.number=grades.subject_number and students.number=grades.student_number;
+-----------+----------+-------+--------+
| number   | name     | grade | title |
+-----------+----------+-------+--------+
| 201804001 | Qiye     |    90 | python |
| 201804001 | Qiye     |    80 | java   |
| 201804002 | JackLee |    89 | python |
| 201804002 | JackLee |    79 | java   |
| 201804003 | Julia   |    88 | python |
| 201804003 | Julia   |    78 | java   |
| 201804004 | Stefer   |    87 | python |
| 201804004 | Stefer   |    77 | java   |
| 201804005 | Steven   |    86 | python |
| 201804005 | Steven   |    76 | java   |
| 201804006 | Mark     |    85 | python |
| 201804006 | Mark     |    75 | java   |
| 201804007 | Stark   |    84 | python |
| 201804007 | Stark   |    74 | java   |
| 201804008 | Tonny   |    83 | python |
| 201804008 | Tonny   |    73 | java   |
| 201804009 | Jarvis   |    82 | python |
| 201804009 | Jarvis   |    72 | java   |
| 201804010 | ZhangSan |    81 | python |
| 201804010 | ZhangSan |    71 | java   |
| 201804011 | lisi     |    91 | python |
| 201804012 | wanger   |    91 | python |
| 201804013 | mazi     |    91 | python |
| 201804014 | xiaoxing |    91 | python |
| 201804015 | hundan   |    91 | python |
| 201804016 | xiaowang |    91 | python |
| 201804016 | xiaowang |    91 | python |
| 201804017 | laowang |    91 | python |
+-----------+----------+-------+--------+
创建一个视图:
create view v_stu_gra_sub as select students.number,students.name,grades.grade,subjects.title from grades,subjects,students where subjects.number=grades.subject_number and students.number=grades.student_number;
:
Query OK, 0 rows affected (0.00 sec)
然后查一下,发现有这张表:
show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| Address       |
| Person         |
| course         |
| grades         |
| my             |
| student       |
| students       |
| subjects       |
| test           |
| v_stu_gra_sub |
| zhongjian     |
+----------------+
再来看一下表中的内容:
mysql> select * from v_stu_gra_sub;
+-----------+----------+-------+--------+
| number   | name     | grade | title |
+-----------+----------+-------+--------+
| 201804001 | Qiye     |    90 | python |
| 201804001 | Qiye     |    80 | java   |
| 201804002 | JackLee |    89 | python |
| 201804002 | JackLee |    79 | java   |
| 201804003 | Julia   |    88 | python |
| 201804003 | Julia   |    78 | java   |
| 201804004 | Stefer   |    87 | python |
| 201804004 | Stefer   |    77 | java   |
| 201804005 | Steven   |    86 | python |
| 201804005 | Steven   |    76 | java   |
| 201804006 | Mark     |    85 | python |
| 201804006 | Mark     |    75 | java   |
| 201804007 | Stark   |    84 | python |
| 201804007 | Stark   |    74 | java   |
| 201804008 | Tonny   |    83 | python |
| 201804008 | Tonny   |    73 | java   |
| 201804009 | Jarvis   |    82 | python |
| 201804009 | Jarvis   |    72 | java   |
| 201804010 | ZhangSan |    81 | python |
| 201804010 | ZhangSan |    71 | java   |
| 201804011 | lisi     |    91 | python |
| 201804012 | wanger   |    91 | python |
| 201804013 | mazi     |    91 | python |
| 201804014 | xiaoxing |    91 | python |
| 201804015 | hundan   |    91 | python |
| 201804016 | xiaowang |    91 | python |
| 201804016 | xiaowang |    91 | python |
| 201804017 | laowang |    91 | python |
+-----------+----------+-------+--------+
以后在想用这张表的时候就像普通的MySQL表一样去查就行。不用输入那么复杂的命令,还不占内存,这张表无论怎么操作都不会对原来的数据造成影响
?