• python——协程


    工作原理:

      来回切换来控制多任务,nginx底层就是利用协程。

      比如,先在qq执行,直到遇到io请求就切换,跑到wechat,当遇到io请求就切换,YouTube也一样

    1. 进程是资源分配的单位
    2. 线程是操作系统调度的单位
    3. 进程切换需要的资源最大,效率低
    4. 线程切换需要的资源一般,效率一般
    5. 协程切换任务资源很小,效率高
    6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协成在一个线程中
    7. 协程又叫做微线程
    8. 进程>线程>协程
    import gevent
    import time
    from gevent import monkey
    monkey.patch_all() #(能够让gevent认识time)
    def test1():
    for i in range(10):
    time.sleep(1)
    (如果不引用monkey,可以用gevent.sleep(1))
    print('test1', i)
    
    def test2():
    for i in range(10):
    time.sleep(2)
    print('test2',i )
    
    g1 = gevent.spawn(test1)
    g2 = gevent.spawn(test2)
    g1.join() #协程用join调用
    g2.join()
    
    结果:
    test1 0
    test2 0
    test1 1
    test1 2
    test2 1
    test1 3
    test1 4
    test2 2
    ...   

    协程并发:
    • 进程是资源分配的单位
    • 线程是操作系统调度的单位
    • 进程切换需要的资源最大,效率低
    • 线程切换需要的资源一般,效率一般
    • 协程切换任务资源很小,效率高
    • 多进程、多线程根据cpu核数不一样可能是并行的,但是协成在一个线程中
    #协程,自动切换
    import gevent,time
    from gevent import monkey
    monkey.patch_all()
    def test1():
        for i in range(10):
            time.sleep(1)
            print('test1', 1)
    def test2():
        for i in range(10):
            time.sleep(2)
            print('test2', 1)
    g1 = gevent.spawn(test1)
    g2 = gevent.spawn(test2)
    g1.join()
    g2.join()
    
    
    #server端
    import gevent
    from gevent import socket, monkey
    monkey.patch_all()
    def server_recv_conn(port):
        s = socket.socket()
        s.bind(('0.0.0.0', port))
        s.listen(200)
        while True:
            conn, addr = s.accept()
            g = gevent.spawn(recv_request, conn)
            g.join()
    def recv_request(conn):
        while True:
            data = conn.recv(1024)
            data = data.decode('utf-8')
            print("recv:", data)
            conn.send(data.upper().encode('utf-8'))
    if __name__ == '__main__':
        server_recv_conn(8888)
    
    #client端
    import socket
    HOST = 'localhost'
    PORT = 8888
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    while True:
        msg = input("==>:")
        s.send(msg.encode('utf-8'))
        data = s.recv(1024)
        print('接收:', data.decode('utf-8'))
    s.close()
    

      

    作者:无荨

    -------------------------------------------

    个性签名:学IT,就要做到‘活到老学到老’!

    如果觉得这篇文章对你有小小的帮助的话,别忘记点个“推荐”哦!

  • 相关阅读:
    对于工程师责任和责任边界的认知
    windows消息机制与实例
    final阶段团队贡献分分配
    Final阶段用户调查报告
    对金州勇士团队的项目进行功能分解(加分作业)
    final review 报告
    final发布评论
    本周PSP
    final发布视频
    【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
  • 原文地址:https://www.cnblogs.com/twoo/p/11686130.html
Copyright © 2020-2023  润新知