Python手动或自动协程操作方法解析


Posted in Python onJune 22, 2020

1.手动协程操作:

# pip install gevent
from greenlet import greenlet

def test():
  print('He ')
  gr2.switch() # 切换到test2
  print('a ')
  gr2.switch()

def test2():
  print('is ')
  gr1.switch()
  print('student.')

gr1 = greenlet(test)  # 创建一个协程
gr2 = greenlet(test2)
gr1.switch()  # 切换到gr1,也就是运行它

2. 自动协程,遇到I/O自动切换

import gevent
from gevent import monkey; monkey.patch_all()  # 导入monkey,给所有支持的模块打上补丁,变成非阻塞模块,也就是使其能够进行协程操作
def test1(n):
  print("I'm doing my homework.")
  gevent.sleep(n)     # 模拟I/O操作,gevent自动切换
  print('Keep doing my homework.')

def test2(n):
  print("I have no time to watch TV.")
  gevent.sleep(n)
  print('Stop thinking!')

def test3():
  print("Life is hard.")

# 等待 greenlets 全部结束
gevent.joinall([
  gevent.spawn(test1,3), # 创建一个新的greeenlet对象,并规划它去执行 test1(3)
  gevent.spawn(test2,1),
  gevent.spawn(test3),
])

结果:

I'm doing my homework.
I have no time to watch TV.
Life is hard.
Stop thinking!
Keep doing my homework.

3. socket 协程实例:

服务器:

import socket
import gevent
from gevent import monkey
monkey.patch_all()  # 打补丁,让所有支持的模块变成非阻塞的方法

def server(ip,port):
  s = socket.socket()  # 生成socket对象
  s.bind((ip, port))  # 绑定ip和端口
  s.listen()      # 设置监听
  while True:
    cli, addr = s.accept()       # 等待连接
    gevent.spawn(handle_request, cli)  # 对每一个连接,使用协程的方法生成greenlet

def handle_request(conn):
  try:
    while True:
      data = conn.recv(1024)  # 接收数据
      print("recv:", data)
      new = 'Hello '+ data.decode().title()
      conn.send(new.encode('utf8'))      # 返回数据
      if not data:
        conn.shutdown(socket.SHUT_WR)
  except Exception as e:
    print(e)
  finally:
    conn.close()
if __name__ == '__main__':
  server('localhost',9999)

客户端:

import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
  con = input('>>>:').strip()
  if len(con) ==0: continue
  client.send(con.encode('utf-8'))
  data = client.recv(1024)
  print(data.decode())
client.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python简单获取数组元素个数的方法
Jul 13 Python
python字符串连接方法分析
Apr 12 Python
Python 3中的yield from语法详解
Jan 18 Python
python如何重载模块实例解析
Jan 25 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
python自动化报告的输出用例详解
May 30 Python
python学生管理系统
Jan 30 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 Python
python中while和for的区别总结
Jun 28 Python
python下载的库包存放路径
Jul 27 Python
python不同版本的_new_不同点总结
Dec 09 Python
python - timeit 时间模块
Apr 06 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 #Python
Python socket服务常用操作代码实例
Jun 22 #Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 #Python
零基础小白多久能学会python
Jun 22 #Python
Keras-多输入多输出实例(多任务)
Jun 22 #Python
python和c语言哪个更适合初学者
Jun 22 #Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 #Python
You might like
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
php 静态变量的初始化
2009/11/15 PHP
php实现分页显示
2015/11/03 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
vue debug 二种方法
2018/09/16 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
破解安装Pycharm的方法
2018/10/19 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
python3中eval函数用法使用简介
2019/08/02 Python
Django 再谈一谈json序列化
2020/03/16 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
销售经理工作职责
2014/02/03 职场文书
教师师德师风整改措施
2014/10/24 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby