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之模拟鼠标键盘动作具体实现
Dec 30 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
详解Python3 pickle模块用法
Sep 16 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
pymysql的简单封装代码实例
Jan 08 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python缺失值的解决方法总结
Jun 09 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
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php桥接模式应用案例分析
2019/10/23 PHP
jQuery的slideToggle方法实例
2013/05/07 Javascript
js中生成map对象的方法
2014/01/09 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python中运行并行任务技巧
2015/02/26 Python
python实现批量改文件名称的方法
2015/05/25 Python
python根据日期返回星期几的方法
2015/07/06 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python实现转圈打印矩阵
2019/03/02 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
电子商务专员岗位职责
2013/12/11 职场文书
建筑文秘专业个人求职信范文
2013/12/28 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
python基于机器学习预测股票交易信号
2021/05/25 Python