首页 > 代码库 > python第十一天

python第十一天

先写博客,复习学习到的知识点后再写作业,这次作业也比较简单哈,这几周的课程不是没有作业就是作业很简单,北方表示很喜欢技术分享,学习进度一下子就上去了,Python持续学习中,运维方面下一阶段转战docker~~~openstack的各个组件已经完全理解,网络模式理解到了80%左右,ceph进度较慢,仅仅理解了估计不到40%,马上10.1了放假再补上吧,也祝大家国庆节快乐,北方一直以为国庆只放假3天的,没想到是7天技术分享

10.1学习计划如下:学习openstack剩余知识点,python进度进展到最少第13天,把docker技术入门及实践书籍看完,离10.1结束还有11天,加油技术分享

 

线程:用于IO密集形

进程:用于CPU密集形

协程:用于IO密集形

 

1.线程创建有2种方式,一种自己创建类实现顶掉python自带的创建线程的类去实现,一种使用python自带的创建线程的类。使用的话当然使用人家直接提供的了

1 import threading

 

2.队列,先进先出,也有先进后出的,这个特性不就是栈么....还有两头都可以出线程的类是threading的,wtf,什么鬼,反正标准的就是先进先出就是

 1 #!/usr/bin/env python 2 import queue 3 q = queue.Queue(2) 4 print(q.empty())            #验证队列是否为空,返回True或者False 5 q.put(1)                    #向对列中放置一个消息,可以是任何类型 6 q.put(2)                    #在放一个 7 print(q.qsize())            #检测当前队列中任务的个数 8 print(q.get())              #获取一个任务,遵循先进先出的规律,因此出来的是1 9 print(q.empty())10 q.put(3, block=True, timeout=2)     #当队列中的任务已经到达队列可容纳上限后之后的任务就会等待11                                     # 可以设置超时时间,或者选择不等待他12 print(q.qsize())
1 C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s2.py2 True3 24 15 False6 27 8 Process finished with exit code 0

生产者消费者模型,只要是解决高并发请求的,也就是我们架构中部署的消息队列服务器,例如rabbitmq,zeromq等等,消息队列服务器的好处有很多了,最主要的功能就是消峰跟解耦,这个知识点在开发这里就不对介绍了

 1 #!/usr/bin/env python 2 import queue 3 import threading 4 import time 5 q = queue.Queue() 6  7  8 def productor(arg): 9     q.put(str(arg) + --食物)10 11 for i in range(300):12     t = threading.Thread(target=productor, args=(i, ))13     t.start()14 15 16 def cousumer(arg):17     while True:18         print(arg, q.get())19         time.sleep(0.1)20 21 for j in range(3):22     t = threading.Thread(target=cousumer, args=(j, ))23     t.start()

线程同时对数据进行操作,那么就会产生脏数据,脏数据是什么鬼,好比买衣服仅剩一件了,但是有10个人同时买了,这时候库存变为了-9,这明显不合理,这就产生了脏数据,因此我们需要加一把锁给线程,线程锁有以下几种:互斥锁,信号量,事件,定时器,条件

 1 #!/usr/bin/env python 2 import threading 3 import time 4  5 NUM = 10 6  7  8 def func(lock): 9     global NUM10     lock.acquire()          #上锁,acquire()固定写法11     NUM -= 112     time.sleep(1)13     print(NUM)14     lock.release()          #开锁,release()固定写法15 16 # lock = threading.BoundedSemaphore(5)      #信号量,可每次释放指定个数的线程17 lock = threading.RLock()                    #互斥锁,每次只会释放一个线程,可复用,包含了threading.Lock()功能18 lock = threading.Lock()                     #互斥锁,每次只会释放一个线程,不可复用,一般不用19 for i in range(30):20     t = threading.Thread(target=func, args=(lock,))21     t.start()
1 #!/usr/bin/env python2 from threading import Timer         #定时器,线程相关的都在threading类内3 4 5 def hello():6     print(hello world)7 8 t = Timer(1, hello)                 #1秒后执行hello函数9 t.start()
 1 #!/usr/bin/env python 2 import threading 3  4  5 def func(i, con): 6     print(i) 7     con.acquire() 8     con.wait() 9     print(i + 100)10     con.release()11 12 c = threading.Condition()       #条件13 for i in range(10):14     t = threading.Thread(target=func, args=(i, c,))15     t.start()16 17 while True:18     inp = input(>>>)19     if inp == q:20         break21     else:22         c.acquire()             #固定写法23         c.notify(int(inp))      #每次放行几个线程24         c.release()             #固定写法
 1 #!/usr/bin/env python 2 import threading 3  4  5 def func(i, e): 6     print(i) 7     e.wait()                    #检测此时锁的状态 8     print(i + 100) 9 10 event = threading.Event()       #事件11 for i in range(10):12     t = threading.Thread(target=func, args=(i, event))13     t.start()14 15 event.clear()                   #线程禁止通行,默认状态16 inp = input(>>>)17 if inp == 1:18     event.set()                 #线程放行
 1 C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s5.py 2 0 3 1 4 2 5 3 6 4 7 5 8 6 9 710 811 912 >>>113 10014 10315 10416 10717 10818 10119 10520 10921 10222 10623 24 Process finished with exit code 0

 进程相关:与线程所具有的功能类似,所有功能都在multiprocessing类内,类内直接提供了进程池(线程池线程类未提供,需要自己定义)

 1 #!/usr/bin/env python 2 from multiprocessing import Pool            #进程池 3 import time 4  5  6 def f1(arg): 7     time.sleep(1) 8     print(arg) 9 10 if __name__ == __main__:11     pool = Pool(5)                          #存放指定个数的进程12     for i in range(30):13         # pool.apply(func=f1, args=(i,))      #每次只释放一个进程14         pool.apply_async(func=f1, args=(i,))       #多个进程同时启用15     time.sleep(2)16     pool.terminate()                        #立即终止17     # pool.close()                          #等所有任务结束后执行18     pool.join()                             

协程相关:首先要下载gevent模块,在cmd中执行pip install gevent即可,这是一条线程持续执行的过程,效率较高,遇到IO会自动切换

 1 #!/usr/bin/env python 2 from gevent import monkey; monkey.patch_all() 3 import gevent 4 import requests 5  6  7 def f(url): 8     print(get %s % url) 9     resp = requests.get(url)10     data =http://www.mamicode.com/ resp.text11     print(%d bytes from %s % (len(data), url))12 13 gevent.joinall([14     gevent.spawn(f, http://www.baidu.com),15     gevent.spawn(f, http://www.163.com),16     gevent.spawn(f, http://www.xy2.com),17 ])
1 C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s11.py2 get http://www.baidu.com3 get http://www.163.com4 get http://www.xy2.com5 2381 bytes from http://www.baidu.com6 95564 bytes from http://www.xy2.com7 721371 bytes from http://www.163.com8 9 Process finished with exit code 0

python第十一天