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实现八大排序算法(2)
Sep 14 Python
Python I/O与进程的详细讲解
Mar 08 Python
Django实现文件上传和下载功能
Oct 06 Python
如何基于python生成list的所有的子集
Nov 11 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Python生成个性签名图片获取GUI过程解析
Dec 16 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
python继承threading.Thread实现有返回值的子类实例
May 02 Python
基于python实现检索标记敏感词并输出
May 07 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
Python安装Bs4的多种方法
Nov 28 Python
Python进程间的通信之语法学习
Apr 11 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
php编程每天必学之表单验证
2016/03/01 PHP
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
设计师个人求职信范文
2014/02/02 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
火锅店的活动方案
2014/08/15 职场文书
现场活动策划方案
2014/08/22 职场文书
早恋主题班会
2015/08/14 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript