协程

协程:

定义:纤程、微线程。本质上只有一个线程在运行

原理:通过应用层记录程序的上下文栈区,实现程序运行中的跳跃。进而实现选择代码段执行。

优点:1、无需多线程切换的开销

    2、资源消耗非常小

    3、无需进行同步互斥操作

    4、对IO并发性极好

缺点:

    1、无法利用计算机多核资源

    2、如果程序阻塞,会阻塞整个进程运行

 

import gevent

def foo(a):
	print('running in foo',a)
	gevent.sleep(4)
	print('switch to foo again')

def bar():
	print('running in bar')
	gevent.sleep(3)
	print('switch to bar again')

#将事件加入协程
f=gevent.spawn(foo,1)
b=gevent.spawn(bar)

gevent.joinall([f,b])

yangrui@ubuntu:~/day10$ python3 gevent_test.py
running in foo 1
running in bar
switch to bar again
switch to foo again

 

import gevent
from gevent import monkey
#在导入socket前执行,改变socket的阻塞形态
monkey.patch_all()

from socket import *
from time import ctime

def server(port):
	s=socket()
	s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

	s.bind(('0.0.0.0',port))
	s.listen(5)
	while True:
		c,addr=s.accept()
		print(addr)
		
		gevent.spawn(handler,c)#不阻塞,使循环继续接收新的客户端链接
#处理客户端事件		
def handler(c):
	while True:
		print('--------------')#打印
		data=c.recv(1024).decode()#阻塞等待接收
		print('==============')#不打印
		if not data:
			break
		print('recvied:',data)
		c.send(ctime().encode())
	c.close()	

if __name__=='__main__':
	server(8000)

 

>tcp套接字接受客户端发送数据;不能接受多个客户端连接,由于是单进程,会阻塞在recv()函数

>多进程可以解决,多客户端连接问题,但多进程消耗资源较大;

>io多路复用也可以解决,多客户连接问题

>协程也可以解决,协程是单进程,它的工作主要是通过,选择可执行代码段,不阻塞在,阻塞语句

 

 

 

 

posted @ 2019-07-31 17:16  sike8  阅读(116)  评论(0编辑  收藏  举报