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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
基于python指定包的安装路径方法
Oct 27 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Apache部署Django项目图文详解
Jul 30 Python
python3字符串输出常见面试题总结
Dec 01 Python
在Python中实现字典反转案例
Dec 05 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
python 如何用terminal输入参数
May 25 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
使用adodb lite解决问题
2006/12/31 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
PHP实现微信退款功能
2018/10/02 PHP
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Python 比较两个数组的元素的异同方法
2017/08/17 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Python处理session的方法整理
2019/08/29 Python
python可视化text()函数使用详解
2020/02/11 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
模具数控专业自荐信
2014/01/27 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书