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,就要做到‘活到老学到老’!

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

原文地址:https://www.cnblogs.com/twoo/p/11686130.html