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实现类似ftp传输文件的网络程序示例
Apr 08 Python
全面了解python字符串和字典
Jul 07 Python
python if not in 多条件判断代码
Sep 21 Python
利用Python破解验证码实例详解
Dec 08 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
python else语句在循环中的运用详解
Jul 06 Python
Python headers请求头如何实现快速添加
Nov 03 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
python如何发送带有附件、正文为HTML的邮件
Feb 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
深入探讨PHP中的内存管理问题
2011/08/31 PHP
深入密码加salt原理的分析
2013/06/06 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php的4种常用运行方式详解
2016/12/22 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
jQuery实现商品活动倒计时
2015/10/16 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
Python实现的简单hangman游戏实例
2015/06/28 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
企业标语口号
2014/06/10 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
工程移交协议书
2016/03/24 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android