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调度框架APScheduler使用
Mar 28 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
Python切片操作实例分析
Mar 16 Python
Python中max函数用于二维列表的实例
Apr 03 Python
python设置环境变量的作用和实例
Jul 09 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
python实现从ftp服务器下载文件
Mar 03 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
5行Python代码实现一键批量扣图
Jun 29 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
Apache中php.ini的设置方法
2013/02/28 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
Python找出9个连续的空闲端口
2016/02/01 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
女性时尚在线:IVRose
2019/02/23 全球购物
物流创业计划书
2014/02/01 职场文书
聘任书模板
2014/03/29 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
全陪导游词开场白
2015/05/29 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库