队列
from random import randint
from queue import Queue
from threading import Thread
my_q = Queue(10)
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)
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,))
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):
self.q = Queue()
for i in range(n):
Thread(target=self.worker,daemon=True).start()
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)
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
----------------------------
完成1go....2go....
都OK
1end....2end....
一直等下去不会结束,我们叫僵尸线程或者孤儿线程
------------------------------------------------------------------------------
以task1为例
from queue import Queue
from threading import Thread
import time
class TheradPool(object):
'''
创建指定数量的线程池,线程池是自己创建的
'''
def __init__(self,n):
self.q = Queue()
for i in range(n):
Thread(target=self.worker,daemon=True).start()
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):
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)
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):
print(args)
print(*args)
func(1,2,3,[1234],'hello')
:
(1, 2, 3, [1234], 'hello')
1 2 3 [1234] hello
---------------------
def func(**args):
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表一样去查就行。不用输入那么复杂的命令,还不占内存,这张表无论怎么操作都不会对原来的数据造成影响