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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
python与php实现分割文件代码
Mar 06 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
python制作小说爬虫实录
Aug 14 Python
wxPython之解决闪烁的问题
Jan 15 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
pandas.cut具体使用总结
Jun 24 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
Python+Selenium实现读取网易邮箱验证码
Mar 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 数组的指针操作实现代码
2011/02/08 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
Javascript中的数学函数
2007/04/04 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
Javascript中神奇的this
2016/01/20 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
Python字符串拼接的几种方法整理
2017/08/02 Python
基于python实现简单日历
2018/07/28 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
python实现定时发送邮件
2020/12/23 Python
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
信息技术教学反思
2014/02/12 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2014年应急工作总结
2014/12/11 职场文书
呐喊读书笔记
2015/06/30 职场文书
诚实守信主题班会
2015/08/13 职场文书