python协程程序gevent

"""
协程:
    gevent(monkey脚本)
        1.生成协程对象    gevent.spawn(func,argv)
        2.阻塞等待协程执行完毕    gevent.joinall(list,[timeout])   list:协程对象列表
        3.gevent睡眠阻塞        gevent.sleep(second)
        4.gevent协程只有在遇到gevent指定的阻塞行为时才会自动在协程之间进行跳转
      如gevent.joinall(),gevent.sleep()带来的阻塞
        monkey:
            gevent提供了一个脚本程序monkey,可以修改底层解释IO阻塞的行为,讲很多普通阻塞转换为gevent阻塞
            1.导入monkey  from gevent import monkey
            2.运行相应的脚本,如转换socket中所有的阻塞   monkey.patch_socket()
            3.如果将所可转换的IO阻塞全部转换则运行all    monkey.patch_all()
            4.脚本运行函数需要在对应模块导入前执行

"""
from gevent import monkey
monkey.patch_time()
import gevent
from time import sleep

def fun1(a, b):
    print("run fun1", a, b)
    # 遇到阻塞去执行fun2函数
    sleep(2)
    print("again run fun1")

def fun2():
    print("run fun2...")
    # 再次遇到阻塞去执行fun1下部分
    gevent.sleep(3)
    print("again run fun2...")
# 生成协程对象
g = gevent.spawn(fun1, 3, 4)
f = gevent.spawn(fun2)

# 只有在遇到阻塞行为时才会跳转
gevent.joinall([g,f])
"""========================================================"""

"""
基于TCP并发实现协程
    1.将每个客户端的处理设置为协程函数
    2.让socket模块下的阻塞可以触发协程跳转

"""
import gevent
from gevent import monkey
# 执行脚本,修改socket阻塞
monkey.patch_socket()
from socket import *
import sys


def handle(val):
    while True:
        data = val.recv(1024).decode()
        if not data:
            break
        print("c>>",data)
        val.send(b'ON')


# 创建套接字
soc = socket(AF_INET, SOCK_STREAM)
# 设置端口立即重用
soc.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 绑定服务器地址
soc.bind(('127.0.0.1', 9090))
# 开启监听服务
soc.listen(3)
# 循环等待客户端连接
while True:
    print("wait client connect...")
    try:
        c, addr = soc.accept()
        print("connect from port", addr)
    except KeyboardInterrupt:
        sys.exit()
    except Exception as a :
        print(a)
        continue
    # 定义处理收发消息的函数,并将函数转化为协程函数
    gevent.spawn(handle,c)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值