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实现dnspod自动更新dns解析的方法
Feb 14 Python
Python 的 with 语句详解
Jun 13 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python 高级专用类方法的实例详解
Sep 11 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
Python处理CSV与List的转换方法
Apr 19 Python
python opencv实现运动检测
Jul 10 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
Python错误的处理方法
Jun 23 Python
10个python爬虫入门实例(小结)
Nov 01 Python
详解Python openpyxl库的基本应用
Feb 26 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将session信息存储到数据库的类实例
2015/03/04 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
Python for i in range ()用法详解
2020/09/18 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
写演讲稿要注意的六件事
2014/01/14 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
大学生演讲稿
2014/04/25 职场文书
医院营销工作计划
2015/01/16 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
实验室安全管理制度
2015/08/05 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
Python实现简单的俄罗斯方块游戏
2021/09/25 Python