工作原理:
来回切换来控制多任务,nginx底层就是利用协程。
比如,先在qq执行,直到遇到io请求就切换,跑到wechat,当遇到io请求就切换,YouTube也一样
- 进程是资源分配的单位
- 线程是操作系统调度的单位
- 进程切换需要的资源最大,效率低
- 线程切换需要的资源一般,效率一般
- 协程切换任务资源很小,效率高
- 多进程、多线程根据cpu核数不一样可能是并行的,但是协成在一个线程中
- 协程又叫做微线程
- 进程>线程>协程
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()