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进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
介绍Python中的__future__模块
Apr 27 Python
python采集百度百科的方法
Jun 05 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
对python制作自己的数据集实例讲解
Dec 12 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python如何调用php文件中的函数详解
Dec 29 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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
php中用文本文件做数据库的实现方法
2008/03/27 PHP
php UBB 解析实现代码
2011/11/27 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python通过文件头判断文件类型
2015/10/30 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python从零开始创建区块链
2018/03/06 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
基于python使用tibco ems代码实例
2019/12/20 Python
python 实现客户端与服务端的通信
2020/12/23 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
几道PHP的面试题
2012/05/19 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
一年级学生评语大全
2014/04/21 职场文书
差生评语大全
2014/05/04 职场文书
应聘教师自荐书
2014/06/16 职场文书
团日活动总结报告
2014/06/25 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
2014年督导工作总结
2014/11/19 职场文书
体育教师个人工作总结
2015/02/09 职场文书
运动会致辞稿
2015/07/29 职场文书
深入理解python多线程编程
2021/04/18 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL