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计算最大优先级队列实例
Dec 18 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python获取txt文件词向量过程详解
Jul 05 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
Python改变对象的字符串显示的方法
Aug 01 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 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 异常处理实现代码
2009/03/10 PHP
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
中专毕业生求职简历的自我评价
2013/10/21 职场文书
竞选班长演讲稿
2013/12/30 职场文书
联谊活动策划书
2014/01/26 职场文书
培训自我鉴定
2014/01/31 职场文书
一名老师的自我评价
2014/02/07 职场文书
房产买卖委托公证书
2014/04/04 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
党员进社区活动总结
2015/05/07 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
入党介绍人意见2015
2015/06/01 职场文书
2016年教代会开幕词
2016/03/04 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL