• Event事件与协程


    
    
        1.Event事件
            Event事件的作用:
                - 用来控制线程的执行.
                - 由一些线程去控制另一些线程.
    
        2.进程池与线程池
            1)什么是进程池与线程池?
                进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量.
    
            2)进程池与线程池的作用:
                保证在硬件允许的范围内创建 (进程/线程) 的数量.
    
        3.协程
            - 进程: 资源单位
            - 线程: 执行单位
            - 协程: 在单线程下实现并发
    
            注意: 协程不是操作系统资源,他是程序起的名字,为让单线程能实现并发.
    
            协程的目的:
                - 操作系统:
                    多道技术, 切换 + 保存状态
                        1) 遇到IO
                        2) CPU执行时间过长
    
                - 协程:
                    通过手动模拟操作系统 "多道技术",实现 切换 + 保存状态
                        1)手动实现 遇到IO切换, 欺骗操作系统误以为没有IO操作.
                            - 单线程下遇到IO, 切换 + 保存状态
                            - 单线程下计算密集型, 来回切换 + 保存状态是,反而效率更低
    
                    优点:
                        在IO密集型的情况下, 会提高效率.
    
                    缺点:
                        若在计算密集型的情况下, 来回切换, 反而效率更低.
    
    		4.TCP服务端实现协程
        
    # 服务单
    from gevent import monkey
    monkey.patch_all()
    import socket
    from gevent import spawn
    server = socket.socket()
    server.bind((
        '127.0.0.1', 9550
    ))
    server.listen(5)
    print('启动服务端。。。')
    def working(conn):
        while True:
            try:
                data = conn.recv(1024)
                if len(data) == 0:
                    break
                print(data.decode('utf-8'))
                conn.send(data.upper())
            except Exception as e:
                print(e)
                break
        conn.close()
    def server2():
        while True:
            conn, addr = server.accept()
            spawn(working, conn)
            # join()
    if __name__ == '__main__':
        # 协程,单线程下实现并发
        g1 = spawn(server2)
        g1.join()
    
    
    # 客户端
    import socket
    from threading import current_thread, Thread
    def client():
        client = socket.socket()
    
        client.connect(
            ('127.0.0.1', 9550)
        )
        number = 0
        while True:
            data = f'{current_thread().name} {number}'
            client.send(data.encode('utf-8'))
            data = client.recv(1024)
            print(data.decode('utf-8'))
            number += 1
    
    # 模拟500个用户并发去访问服务端
    for i in range(500):
        t = Thread(target=client)
        t.start()
    
    
    
  • 相关阅读:
    javaScript中的onclick与jquery中的click区别
    javascript之parseInt的用法分析
    代码重构Refactor
    java-快捷生成Get/Set
    Java 调试和断点的介绍
    Java 运行报错:不支持发行版本 5
    实体类Json串转成DataTable
    sqlserver 如何瞬间执行上万条数据
    windows7远程连接服务器出现身份验证错误,又找不到加密Oracle修正
    MYSql 存储过程自定义跳出
  • 原文地址:https://www.cnblogs.com/jinhongquan/p/11734277.html
Copyright © 2020-2023  润新知