首页 > 其他分享 >第三篇:协程

第三篇:协程

时间:2023-02-16 10:44:45浏览次数:44  
标签:__ 第三篇 协程 gevent time print import def

协程的介绍

"""
进程:资源单位
线程:执行单位
协程:单线程下实现并发(这个概念完全是由程序员意淫出来的,根本不存在)
    程序员在代码层面上检测所有的IO操作,一旦遇到IO,将在代码级别完成切换
    这样给CPU的感觉是这个程序一直运行,没有IO,从而提升程序的运行效率

多道技术
    切换+保存状态
    CPU两种切换(1.程序遇到IO  2.程序长时间占用)

代码如何做到切换+保存状态
    切换
        切换不一定提高效率,也可能降低效率
        IO切          提升
        没有IO切    降低
    保存状态
        保存上一次执行的状态,下一次来接着执行上一次的操作继续往后执行
        yield  
"""

验证切换是否一定能提高效率

# 串行执行计算密集型任务    0.5209994316101074
import time
def func1():
    for i in range(10000000):
        i + 1

def func2():
    for i in range(10000000):
        i + 1

start_time = time.time()
func1()
func2()
print(time.time() - start_time)


# 切换 + yield    0.7936575412750244
import time
def func1():
    while True:
        10000000 + 1
        yield

def func2():
    g = func1()  # 先初始化出生成器
    for i in range(10000000):
        i + 1
        next(g)

start_time = time.time()
func2()
print(time.time() - start_time)

 

gevent模块(了解)

安装:pip3 install gevent

from gevent import monkey;monkey.patch_all()
import time
from gevent import spawn

'''
gevent模块本身无法检测常见的一些io操作
在使用的时候需要你额外的导入一句话
from gevent import monkey
monkey.patch_all()
由于上面的两句话在使用gevent模块的时候是肯定要导入的,支持简写
from gevent import monkey;monkey.patch_all()
'''

def heng():
    print('哼')
    time.sleep(2)
    print('哼')
def ha():
    print('哈')
    time.sleep(3)
    print('哈')
def heiheihei():
    print('heiheihei')
    time.sleep(3)
    print('heiheihei')
start_time = time.time()
g1 = spawn(heng)
g2 = spawn(ha)
g3 = spawn(heiheihei)
g1.join()
g2.join()
g3.join()
print(time.time() - start_time)  # 3.109663963317871

 

协程实现TCP服务端的并发

# 服务端
from gevent import monkey;monkey.patch_all()
import socket
from gevent import spawn

def communication(conn):
    while True:
        try:
            data = conn.recv(1024)
            if len(data) == 0: break
            conn.send(data.upper())
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()

def server(ip, port):
    server = socket.socket()
    server.bind((ip, port))
    server.listen(5)
    while True:
        conn, addr = server.accept()
        spawn(communication, conn)

if __name__ == '__main__':
    g1 = spawn(server, '127.0.0.1', 8080)
    g1.join()

# 客户端
from threading import Thread, current_thread
import socket

def x_client():
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    n = 0
    while True:
        msg = '%s say hello %s'%(current_thread().name,n)
        n += 1
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print(data.decode('utf-8'))

if __name__ == '__main__':
    for i in range(500):
        t = Thread(target=x_client)
        t.start()

 

理想状态:

 我们可以通过多进程下面开设多线程,多线程下面开设协程程序,从而使我们的程序执行效率提高

标签:__,第三篇,协程,gevent,time,print,import,def
From: https://www.cnblogs.com/yuanxiaojiang/p/17125877.html

相关文章

  • 4.协程模块
    协程:用户态的线程,相当于线程中的线程,更轻量级。后续配置sockethook,可以把复杂的异步调用,封装成同步操作。降低业务逻辑的编写复杂度。目前该协程是基于ucontext_t来实现......
  • Python 高级编程之生成器与协程进阶(五)
    目录一、概述二、生成器1)生成器和迭代器的区别2)生成器创建方式1、通过生成器函数创建2、通过生成器表达式创建3)生成器表达式4)yield关键字5)生成器函数6)return和yield异同......
  • Python 高级编程之IO模型与协程(四)
    目录一、概述二、IO模型1)IO模型准备1、用户空间和内核空间2、进程切换3、进程的阻塞4、文件描述符fd5、缓存I/O2)IO模型详解1、同步阻塞IO(BlockingIO)2、同步非阻塞IO(Non......
  • Go使用协程批量获取数据,加快接口返回速度
    服务端经常需要返回一个列表,里面包含很多用户数据,常规做法当然是遍历然后读缓存。使用Go语言后,可以并发获取,极大提升效率。使用channelpackagemainimport("fmt"......
  • Python使用协程的缺点
    1、多核资源不能使用:协程的本质是单线程,它不能同时使用单个CPU的多核、协程。2、在多CPU上运行程需要与过程配合。当然,每天编写的大多数应用程序都没有必要。除非是cpu密集......
  • Go使用协程批量获取数据,加快接口返回速度
    服务端经常需要返回一个列表,里面包含很多用户数据,常规做法当然是遍历然后读缓存。使用Go语言后,可以并发获取,极大提升效率。使用channelpackagemainimport("fmt"......
  • Python requests.Session 协程 下载文件
    Pythonrequests.Session协程下载文件 #coding:utf-8fromgeventimportmonkeymonkey.patch_all()fromgevent.poolimportPoolimportgeventimportrequ......
  • Python中monkey.patch_all()解决协程阻塞问题
    Python全栈工程师核心面试300问深入解析(2020版)----全文预览Python全栈工程师核心面试300问深入解析(2020版)----欢迎订阅直接参考以下实例,采用协程访问三个网站......
  • kotlin协程介绍(一)
    问题背景我们在kotlin的学习和使用过程中,协程是一个很重要的概念,这个也是java没有的,那么,什么是协程呢?协程的定义:可以将它理解成一种轻量级的线程。我们之前所学习的线程是......
  • Python并发执行的简易实现:多进程、多线程、协程
    多进程importloggingimporttimefrommultiprocessingimportPoollogging.basicConfig(format='%(asctime)s%(message)s',level=logging.INFO)deff(x):time.sleep(......