zoukankan      html  css  js  c++  java
  • 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,就要做到‘活到老学到老’!

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

  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/twoo/p/11686130.html
Copyright © 2011-2022 走看看