• 协程


    协程:

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

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

    优点: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多路复用也可以解决,多客户连接问题

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

  • 相关阅读:
    HTML5 新标签
    lAMBDA表达式剖析
    whitespace 属性设置如何处理元素内的空白。
    "~/" asp.net 表示路径的方法
    ASP.NET Session详解
    关于CSS Selector的优先级
    关于汉字转拼音
    ChildActionOnly + ActionName的用法
    html中的caption是什么用
    window.location.href location.href parent.location.href
  • 原文地址:https://www.cnblogs.com/sike8/p/11276069.html
Copyright © 2020-2023  润新知