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中的包和模块实例
Nov 22 Python
python 写的一个爬虫程序源码
Feb 28 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
python对视频画框标记后保存的方法
Dec 07 Python
基于python实现从尾到头打印链表
Nov 02 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
基于python实现计算两组数据P值
Jul 10 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python 基于opencv实现图像增强
Dec 23 Python
Matplotlib绘制混淆矩阵的实现
May 27 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
PHP echo()函数讲解
2019/02/15 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
常见python正则用法的简单实例
2016/06/21 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
python selenium firefox使用详解
2019/02/26 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
python 初始化一个定长的数组实例
2019/12/02 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
JMS中Topic和Queue有什么区别
2013/05/15 面试题
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
往来会计岗位职责
2013/12/19 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书