• 网络编程 进程池,线程池,携程,


    线程池与进程池

    什么是池?

    在保证计算机硬件安全的情况下最大限度的利用计算机

    池其实是降低了程序的运行效率 到那时保证了计算机的硬件的安全

    (硬件的发展赶不上软件的速度)

     

    线程池,进程池

    import time
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

    def func(n):

       time.sleep(2)
       return n**2

    def outer(n):
       print("我拿到了返回值",n.result())

    pool = ProcessPoolExecutor(5)
    if __name__ == '__main__':
       for i in range(20):
           pool.submit(func,i).add_done_callback(outer)
          # pool.shutdown()关闭池子等待所有的任务执行完毕在运行下面代码
          #pool
          #pool.submit(task, 1) # 朝线程池中提交任务   异步提交
          #add_done_callback 提交任务的时候绑定一个回调函数一旦任务有结果 立即执行
          #异步回调机制:当异步提交的任务有返回结果之后,会自动触发回调函数的执行
          #开线程成和进程池 只需要把 名字换掉就行

     

    协程

    进程:资源单位

    线程:执行单位

    携程:单线程下实现并发

    服务端
    from gevent import monkey;monkey.patch_all()
    import socket
    from gevent import spawn


    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)


    def talk(conn):
       while True:
           try:
               data = conn.recv(1024)
               if len(data) == 0:break
               print(data.decode('utf-8'))
               conn.send(data.upper())
           except ConnectionResetError as e:
               print(e)
               break
       conn.close()

    def server1():
       while True:
           conn, addr = server.accept()
           spawn(talk,conn)

    if __name__ == '__main__':
       g1 = spawn(server1)
       g1.join()

    客户端

    import socket
    from threading import Thread,current_thread


    def client():
       client = socket.socket()
       client.connect(('127.0.0.1',8080))
       n = 0
       while True:

           data = '%s %s'%(current_thread().name,n)
           client.send(data.encode('utf-8'))
           res = client.recv(1024)
           print(res.decode('utf-8'))
           n += 1

    for i in range(400):
       t = Thread(target=client)
       t.start()

    并发

    切换+保存状态

    ps:看起来像同时执行的 就可以称之为并发

    协程:完全就是程序员自己想出来的一个名字

    作用就是在单线程下实现并发

    并发的条件?

    多道技术

    时间上的复用

    空间上的复用

    切换+保存状态

    程序员通过代码自己检测程序种的IO

    一旦遇到IO自己通过代码来切换

    给操作系统的感觉就是你这个线程没有任何IO

    ps:通过人为的操作,欺骗了操作系统 让他误认为你这个程序没有IO

    从而保证程序在运行态和就绪态来回切换

    提高代码的运行效率

    切换+保存状态就一定能够提升效率吗???

    当你的任务是io密集型的情况下 提高效率


    from gevent import monkey;monkey.patch_all()#由于该模块经常使用所以支持这样 写
    from gevent import spawn
    import time

    """注意gevent模块没办法自动制备time.sleep等io情况
    需要自己手动在添加一个配置
    """
    def func():
       print("haha")
       time.sleep(2)
       print("haha")
    def inner():
       print("enenen")
       time.sleep(2)
       print("enenen")

    res1 = spawn(func)
    res2 = spawn(inner)
    res1.join()
    res2.join()
    #spawn会检查所有任务 当遇到io的会自动调转下一个任务

    当你的任务是机选密集密集型的 降低效率

    IO模型

     

  • 相关阅读:
    Day4-装饰器
    Day3-递归函数、高阶函数、匿名函数
    Day3-函数及作用域
    Day2-字符编码转换
    Day2-文件操作
    Day2-列表、字符串、字典、集合
    Day1-模块初识
    JavaScript 笔试题
    从JavaScript 数组去重谈性能优化
    prototype
  • 原文地址:https://www.cnblogs.com/yangxinpython/p/11360635.html
Copyright © 2020-2023  润新知