python——协程

工作原理:
来回切换来控制多任务,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()
作者:无荨
-------------------------------------------
个性签名:学IT,就要做到‘活到老学到老’!
如果觉得这篇文章对你有小小的帮助的话,别忘记点个“推荐”哦!

浙公网安备 33010602011771号