• 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:UsersAdministratorAppDataLocalProgramsPythonPython35python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s2.py
    2 True
    3 2
    4 1
    5 False
    6 2
    7 
    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 NUM
    10     lock.acquire()          #上锁,acquire()固定写法
    11     NUM -= 1
    12     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 python
    2 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         break
    21     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:UsersAdministratorAppDataLocalProgramsPythonPython35python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s5.py
     2 0
     3 1
     4 2
     5 3
     6 4
     7 5
     8 6
     9 7
    10 8
    11 9
    12 >>>1
    13 100
    14 103
    15 104
    16 107
    17 108
    18 101
    19 105
    20 109
    21 102
    22 106
    23 
    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 = resp.text
    11     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:UsersAdministratorAppDataLocalProgramsPythonPython35python.exe C:/Users/Administrator/PycharmProjects/ACE/study11/s11.py
    2 get http://www.baidu.com
    3 get http://www.163.com
    4 get http://www.xy2.com
    5 2381 bytes from http://www.baidu.com
    6 95564 bytes from http://www.xy2.com
    7 721371 bytes from http://www.163.com
    8 
    9 Process finished with exit code 0
  • 相关阅读:
    Linux设备驱动第六篇:高级字符驱动操作之iotcl
    Stack的三种含义
    用vs2013+velt-0.1.4进行嵌入式开发 进行海思平台 UBOOT 开发
    学会思考技术背后的那些思想和本质
    Rails 4.0.0 开发环境一切正常,到生成环境发现 无法找到 css 和 js
    一加手机,迟到的惊喜
    附近的人计算方法-----使用mysql脚本计算方法
    如何将Superset嵌入后台系统之实践
    这里是纯干货!2018年深度学习的10个发展预测
    这里是纯干货!2018年深度学习的10个发展预测
  • 原文地址:https://www.cnblogs.com/bfmq/p/5911252.html
Copyright © 2020-2023  润新知