队列,线程池,视图

队列

# 创建队列(可以指定长度),把任务往池里放,扔是一个线程,取是一个线程,下面代码里的数字是任务数
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表一样去查就行。不用输入那么复杂的命令,还不占内存,这张表无论怎么操作都不会对原来的数据造成影响

 

posted on 2022-03-15 17:42  请你一定要记得我好吗  阅读(115)  评论(0)    收藏  举报