python中gevent库用法详解(协程)

1、gevent库可以轻松实现并发同步或异步编程。gevent中使用的主要模式是Greenlet,它是以C扩展模块的形式访问Python的轻量级协程。

2、Greenlet全部运行在主程序操作系统的过程中,但是它们是协作调度的。

安装gevent库:

pip install gevent

示例代码1:

from gevent import monkey  # 为了能识别time模块的io

monkey.patch_all()  # 必须放到被打补丁者的前面,如 time,socket 模块之前
import gevent
import time


def gf(name):
    print(f'{name}:我想打王者!!')
    # gevent.sleep(2)
    time.sleep(2)
    print(f'{name}:我想吃大餐!!!')


def bf(name):
    print(f'{name}:一起打!!!')
    # gevent.sleep(2)
    time.sleep(2)
    print(f'{name}:一快去吃!!')


if __name__ == "__main__":
    start = time.time()
    # 创建协程对象
    g1 = gevent.spawn(gf, '张三')
    g2 = gevent.spawn(bf, '李四')

    # 开启任务
    g1.join()
    g2.join()
    end = time.time()
    print(end - start)

运行结果:

 示例代码2:

import gevent


def foo():
    print('Running in foo')
    gevent.sleep(2)
    print('Explicit context switch to foo again')


def bar():
    print('Explicit context to bar')
    gevent.sleep(2)
    print('Implicit context switch back to bar')


gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])

运行结果:

示例代码3:  【程序准确性待检查】

from gevent import monkey, socket, pool

monkey.patch_all()


def server(port, pool):
    s = socket.socket()
    s.bind(('0.0.0.0', port))
    s.listen()
    while True:
        cli, addr = s.accept()
        print("Welcome %s to SocketServer" % str(addr[0]))
        # 通过pool.spawn()运行协程
        pool.spawn(handle_request, cli)


def handle_request(conn):
    try:
        data = conn.recv(1024)
        print("recv:", data)
        data = "From SockeServer:192.168.1.1---%s" % data.decode("utf-8")
        conn.sendall(bytes(data, encoding='utf-8'))
        if not data:
            conn.shutdown(socket.SHUT_WR)
    except Exception as e:
        print(e)
    finally:
        conn.close()


if __name__ == '__main__':
    # 限制并发协程数量为5
    pool = pool.Pool(5)
    server(80, pool)

参考博文:

Python基础教程——多协程并发——gevent

Python中Gevent的使用-Python学习网

python —— gevent详解(二) 协程、进程、线程_胖虎是只mao的博客-CSDN博客_python中gevent

Python并发Gevent库(一)_肥宅_Sean的博客-CSDN博客

python3通过gevent.pool限制协程并发数量 - chengd - 博客园 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值