python并发编程6-协程

1、基础

# 进程 启动多个进程 进程之间是由操作系统(时间片轮转)负责调用
# 线程 启动多个线程 真正被CPU执行的最小单位是线程# 开启一个线程 创建一个线程 寄存器 堆栈# 关闭一个线程  等都需要时间
# 协程:本质上是一个线程# 能够在多个任务之间切换来节省一些IO时间# 协程切换也需要时间,但是远远小于线程进程开销时间
# 实现并发的手段

2 协程应用背景

import time
'''1'''
def consumer():  # 生成器函数print(123)while True:x=yieldprint('**',x)
c=consumer()  # c为生成器,此时函数并没有执行
next(c)
c.send(1)

程序执行顺序:

程序运行结果:

3 在一个程序上进行两个任务的切换

'''2 在一个程序上进行两个任务的切换'''
def consumer():  # 生成器函数while True:x=yieldtime.sleep(1)print('处理了数据',x)
def producer():c=consumer()next(c)for i in range(3):time.sleep(1)print('生产了数据:',i)c.send(i)
producer()

程序执行顺序:

程序运行结果:

4、协程切换:切换后接着执行-greenlet模块

'''3 协程切换:切换后接着执行'''
from greenlet import greenlet
# 真正的协程模块就是使用greenlet完成的切换
def eat():print('eating start')g2.switch()print('eating end')g2.switch()
def play():print('playing start')g1.switch()print('playing end')
g1=greenlet(eat)
g2=greenlet(play)
g1.switch()

程序执行顺序:

程序执行结果:

5 协程切换 gevent

# spawn(func) 大量生产
# join()
# .value 得到方法的返回值

 例子1:

import geventdef eat():print('eating start')gevent.sleep(1)print('eating end')
def play():print('playing start')gevent.sleep(1)print('playing end')
g1=gevent.spawn(eat)  # 开启一个协程
g2=gevent.spawn(play)
g1.join() # 主线程等待g1结束
g2.join()  # 主线程等待g2结束

 运行结果:

协程对time.sleep(1)不会有效果。只对gevent.sleep(1)有效果。除非用monkey模块。如下:

from gevent import monkey;monkey.patch_all()   # 有了这句代码,自动会把IO操作打包。否则就需要用gevent.sleep()
import gevent
def eat():print('eat:', threading.current_thread().getName()) #DummyThread-1假线程print('eating start')time.sleep(1) # IO事件print('eating end')
def play():print('play:', threading.current_thread().getName())print('playing start')time.sleep(1)  # IO事件print('playing end')
g1=gevent.spawn(eat)  # 开启一个协程
g2=gevent.spawn(play)
g1.join()
g2.join()

运行结果:

协程属于伪线程

6 同步和异步

# 进程和线程的状态切换是由操作系统完成
# 协程任务之间的切换是由程序(代码)完成。# 只有遇到协程模块能识别的IO操作的时候,程序才会进行任务切换,实现并发的效果#同步和异步:在高IO之间使用协程操作
# 协程 : 能够在一个线程中实现并发效果的概念# 能够规避一些任务中的IO操作# 在任务的执行过程中检测到IO就切换到其他任务

 

from gevent import monkey;monkey.patch_all()  # 必须写在import其他模块之前
import time  
import gevent
def task():time.sleep(1)print(12345)
def sync():for i in range(10):task()
def async():g_lst=[]for i in range(10):g=gevent.spawn(task)g_lst.append(g)# for g in g_lst:g.join()gevent.joinall(g_lst)
sync()
async()

运行结果:

输出过程:先一秒一秒输出12345.输出四个后。同时输出5个12345

7 利用协程实现socket聊天

server模块:

import socket
from gevent import monkey;monkey.patch_all()
import gevent
def talk(conn):conn.send(b'hello')print(conn.recv(1024).decode('utf-8'))conn.close()
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:conn,addr=sk.accept()gevent.spawn(talk,conn)
sk.close()

client模块:
 

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
print(sk.recv(1024))
msg=input('>>>').encode('utf-8')
sk.send(msg)
sk.close()

运行结果:

进程,线程,协程个数关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter之HTTP请求上传文件/上传图片

Jmeter实现接口上传图片 一、Fiddler抓包上传图片接口 查看WebForms&#xff0c;接口传参为空&#xff0c;文件/图片传参为<file>对用的Name值&#xff1a; Content-Disposition: form-data; name"file"; filename"IMG_20191116_110507.jpg" Con…

js关闭setInterval及终止ajax请求

用clearInterval&#xff08;&#xff09;即可搞定。亲测有效 $(document).ready(function(){c setInterval(checkIsExist,10000);//每10秒执行一次checkIsExist方法 }); function checkIsExist(){$.ajax({type: "POST",url: "/SecondServlet",data: &qu…

Jmeter吞吐量控制器详解

一、吞吐量控制器 吞吐量控制器(Throughput Controller)用来控制其下元件的执行次数&#xff0c;并无控制吞吐量的功能。 作用&#xff1a;控制其下的子节点的执行次数与负载比例分配 吞吐量控制器字段介绍&#xff1a; Total Executions&#xff1a;执行百分比&#xff08;…

Python递归通用接口响应深层提取

最近在做接口自动化断言时&#xff0c;每个接口文件里都写了一遍提取接口响应数据&#xff0c;然后append到列表里&#xff0c;传给公共的断言方法与sql查询出来的数据做比对&#xff0c;这样如果是100个接口&#xff0c;每个接口都写一遍接口响应数据提取&#xff0c;就要写10…

django与grpc融合的过程

一、通过socket将grpc接收的数据传输到django中 # djangogrpcsocket(服务端给客户端发送文件) 配置过程# 将socket的服务端作为一个线程&#xff0c;放在grpc服务端下&#xff0c;一起启动# 将socket的客户端作为一个模块&#xff0c;直接嵌入在websocket的while True循环之下接…

Jmeter之json条件提取实战(三)

有时我们想通过接口响应数据中的默写条件进行提取对应的字段&#xff0c;这时&#xff0c;就可以用到json条件提取&#xff0c;可以提取对应的值进行使用或迭代。 接口请求地址&#xff1a; sh.lianjia.com/api/newhouserecommend?type1&queryhttps%3A%2F%2Fsh.lianjia.…

python 手动拼接json数据

第一步&#xff1a;分别拼接为字符串 第二步&#xff1a;将字符串转化为list 第三歩&#xff1a;将两个list合并为dict 第四步&#xff1a;将dict转换为接送数据 如&#xff1a; import json keys [a, b, c] values [1, 2, 3] dictionary dict(zip(keys, values)) j …

Python格式化函数format详解

format用法 相对基本格式化输出采用‘%’的方法&#xff0c;format()功能更强大&#xff0c;该函数把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’使用方法由两种&#xff1a;b.format(a)和format(a,b) fo…

django后端用websocket传输数据

1、websocket服务端发送数据好像只能传输str类型数据。所以先将数据利用json.dumps()进行打包操作 json_data json.dumps(data) 2、websocket客户端接收数据时需要先将json对象进行解码。利用 var obj_temp JSON.parse(str); //由JSON字符串转换为JSON对象 此时若在界面直…

Python自动化测试问题及处理方法(一)

一、接口自动化测试中&#xff0c;会用到测试账号&#xff0c;如何合理运用账号&#xff1f; 账号一般用于接口登录、接口用例传参、操作sql等&#xff0c;目前账号是写到yaml配置文件里&#xff0c;如果1个账户使用会出现资源冲突&#xff0c;可以配置多个账号使用&#xff0…

Python自动化测试|如何解决前置模块及数据依赖(二)

在做接口自动化测试时&#xff0c;遇到下面这个疑惑&#xff0c;然后再群里请教了大家&#xff0c;讨论如下&#xff0c;可以参考下&#xff1a; 讨论1&#xff1a; 上海—橙子探索测试 10:12:34 自动化测试中&#xff0c;提现接口一般会依赖前置功能实名认证、绑卡、设置交易…

django启动时同时使用Schedule启动其他程序

1、安装Schedule 打开cmd输入&#xff1a; pip install schedule 2、打开django项目的views.py 导入模块 from apscheduler.scheduler import Scheduler 输入如下代码&#xff1a; sched Scheduler() # 实例化&#xff0c;固定格式 # sched.interval_schedule(days1,s…

Pytest框架集成Allure定制测试报告详解(一)

Allure简介 Allure是一款非常轻量级并且非常灵活的开源测试报告生成框架。 它支持绝大多数测试框架&#xff0c; 例如TestNG、Pytest、JUint等。它简单易用&#xff0c;易于集成。下面就Pytest如何与Allure集成做详细介绍。 Pytest框架集成Allure Pytest是Python的单元测试框架…

div里面放ul,使ul横向和纵向滚动

js代码&#xff1a; .infoShow{border:1px solid #000;overflow-y:auto;height:340px;}.infoShow ul{margin:0px;padding:0px;float:left;white-space: nowrap;overflow:hidden;}.infoShow ul li{float: left;text-align:left;list-style:none;display: inline;} 注意&#xf…

Pytest+Allure+Jenkins接口自动化项目实战(一)

经过一周多时间&#xff0c;基于pythonpytestexcelallure框架的接口自动化测试初版已基本实现&#xff0c;包括基本配置读取、用例读取、用例执行、sql读取执行、前置数据准备、后置数据清理以及测试报告生成等&#xff0c;环境独立运行、项目独立运行、用例独立运行、jenkins集…

服务器测试网址填写注意事项

1、若服务器和客户端都在本机&#xff0c;则测试ip可用127.0.0.1 2、若服务器在电脑A&#xff0c;客户端在电脑B&#xff0c;则首先A、B电脑需要在同一局域网上&#xff0c;然后测试网址分别为各自ip 3、若是发布在云端&#xff0c;则应使用0.0.0.0 4、django项目的启动命令…

Jmeter BeanShell取样器操作变量(一)

vars: 引用Jmeter线程的局部变量&#xff0c;将 局部变量 改为 全局变量 亦可达到引用全局变量的效果&#xff0c; 连通Jmeter 和 beanshell string user vars.get("user")//获取变量&#xff0c;保存变量 vars.put&#xff08;String key, String value&#xf…

echarts3 loading动画无法去除解决方案

解决方案一&#xff1a; 不使用showloading&#xff0c;判断传入数据是否为空。 若数据为空&#xff0c;覆盖一层div。 若数据不为空&#xff0c;则隐藏div 解决方案2&#xff1a; 利用echarts的graphic。初始化是加入graphic。有数据时再利用id移除掉graphic。 初始化时&…

Jmeter Beanshell采样器调用JAVA方法(二)

BeanShell Sampler调用添加的java方法 1、BeanShell Sampler里添加java方法 public static String test() {vars.put("jmeter1","111");vars.put("jmeter2","222");vars.put("jmeter3","333");vars.put("j…

grpc服务器和客户端互传数据

一、客户端给服务器传数据 1、data.proto syntax proto3; // 服务定义 service data{// 函数定义 data_request参数 data_reply返回数据rpc serving(data_request) returns (data_reply) {} } message data_request{string cmd 1; } message data_reply{string values 1; } …