Python并发编程:协程-gevent模块

一 gevent模块

Gevent是一个第三方库,可以轻松通过gevent实现并发同步或异步编程。在gevent中用到的主要模式是Greenlet,它是以C扩展模块形式接入Python的轻量级协程。Greenlet 全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

# 用法

g1=gevent.spawn(func,1,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的

g2 = gevent.spawn(func2)

g1.join()    # 等待g1结束

g2.join()    # 等待g2结束

# 或者上述两步合作一步:gevent.joinall([g1,g2])

g1.value    # 拿到func1的返回值

遇到IO阻塞时会自动切换任务

import gevent

def eat(name):

    print('%s eat 1' % name)

    gevent.sleep(2)

    print('%s eat 2' % name)

def play(name):

    print('%s play 1' % name)

    gevent.sleep(1)

    print('%s play 2' % name)

g1 = gevent.spawn(eat, 'mike')

g2 = gevent.spawn(play, 'mike')

g1.join()

g2.join()

print('主')

上例gevent.sleep(2)模拟的是gevent可以识别的io阻塞

而time.sleep(2)或其它的阻塞,gevent是不能直接识别的需要用下面一行代码,打补丁,就可以识别了

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

或者我们干脆记忆成:要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头

from gevent import monkey;monkey.patch_all()

import gevent

import time

def eat(name):

    print('%s eat 1' % name)

    time.sleep(2)

    print('%s eat 2' % name)

def play(name):

    print('%s play 1' % name)

    time.sleep(1)

    print('%s play 2' % name)

g1 = gevent.spawn(eat, 'mike')

g2 = gevent.spawn(play, 'mike')

g1.join()

g2.join()

print('主')

我们可以用threading.current_thread().getName()来查看每个g1和g2,查看的结果为DummyThread-n,即假线程

 二 练习

服务端

from gevent import monkey;monkey.patch_all()

from socket import *

import gevent

# 如果不想用monkey.patch_all()打补丁,可以用gevent自带的socket

# from gevent import socket

# s = socket.socket()

def server(server_ip, port):

    = socket(AF_INET, SOCK_STREAM)

    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

    s.bind((server_ip, port))

    s.listen(5)

    while True:

        conn, addr = s.accept()

        gevent.spawn(talk, conn, addr)

def talk(conn, addr):

    try:

        while True:

            res = conn.recv(1024)

            print('client %s:%s msg: %s' % (addr[0], addr[1], res))

            conn.send(res.upper())

    except Exception as e:

        print(e)

    finally:

        conn.close()

if __name__ == '__main__':

    server('127.0.0.1'8080)

客户端

from threading import Thread

from socket import *

import threading

def client(server_ip, port):

    = socket(AF_INET, SOCK_STREAM)    # 套接字对象一定要加到函数内,即局部名称空间内,放在函数外则被所有线程共享,则大家公用一个套接字对象,那么客户端端口永远一样了

    c.connect((server_ip, port))

    count = 0

    while True:

        c.send(('%s say hello %s' % (threading.current_thread().getName(), count)).encode('utf-8'))

        msg = c.recv(1024)

        print(msg.decode('utf-8'))

        count += 1

if __name__ == '__main__':

    for in range(500):

        = Thread(target=client, args=('127.0.0.1'8080))

        t.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解

前言 2021年5月,OpenAI发表了《扩散模型超越GANs》的文章,标志着扩散模型(Diffusion Models,DM)在图像生成领域开始超越传统的GAN模型,进一步推动了DM的应用。 然而,早期的DM直接作用于像素空…

cmd模式下启动mysql

1.打开cmd输入services.msc,找到MYSQL,右击属性,找到可执行文件路径,加载到环境变量。 2.打开cmd,启动MYSQL:输入net start mysql; 3.登陆MYSQL,需要管理权限; 输入:my…

HALCON 快速入门手册

HALCON 快速入门手册 1 什么是 HALCON HALCON 是德国 MVtec 公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛 的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON 灵活的 架构便于机器视觉,医学图像和图像分析应…

Docker容器化解决方案

什么是Docker? Docker是一个构建在LXC之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud 基于go语言开发,遵从Apache2.0开源协议。 Docker 自开源后受到广泛的关注和…

数据链路层----滑动窗口协议的相关计算

目录 1.窗口大小的相关计算 •停等协议: •后退N帧协议: •选择重传协议: 2.信道利用率相关计算 •停等协议的信道利用率: •连续ARQ(后退N帧协议,选择重传协议)的信道利用率:…

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器: 二、Queue队列 三、Map映射 四、题目(快递分拣 vector): 代码: 五、题目(CLZ银行问题 queue): 代码: 六、题目(费里的语言 map&…

每日学习总结20240301

20240301 1. strchr VS strrchr strchr和strrchr是C语言标准库中的字符串处理函数,用于在字符串中查找特定字符的位置。 1.1 strchr函数 strchr函数用于在字符串中查找第一次出现指定字符的位置,并返回该位置的指针。函数原型如下: char…

你都了解2024程序员拿捏高薪的新方式吗?

2024年,程序员该如何拿高薪呢? 道理是这么讲,那我们到底应该如何去践行呢?以我自身的经验来看,网络接单无疑是我们程序员来钱最快的方式,既可以做到兼顾本职工作和快点搞钱,又可以充分利用好每一…

云解析的高防DNS技术有哪些优势和作用?(国科云)

云解析作为一种更加智能安全的解析技术,开始替代传统解析技术,受到越来越多政府机关和企业的关注和信赖。相比传统解析技术,云解析具备智能解析、健康监测、全局流量管理等技术优点,有效提升DNS解析的效率和精度,而其所…

rearrangement-challenge-2022环境使用学习(一)

搭建了rearrangement-challenge-2022的环境: https://github.com/facebookresearch/habitat-challenge/tree/rearrangement-challenge-2022 habitat最大的缺点是对不同的版本非常的敏感。本文只是针对rearrangement-challenge-2022的学习。 文档一开始会很不完善&a…

信息安全系列04-安全启动介绍

本文框架 1. 基本概念1.1 基本概念回顾1.2 数字签名及验签流程 2. 安全启动实施2.1 信任根选择2.1.1 使用HSM作为信任根2.1.2 使用最底层Bootloader作为信任根 2.2 校验方法确认2.2.1 基于非对称加密算法(数字签名)2.2.2 基于对称加密算法 2.3 安全启动方…

llvm AST consumer 示例

示例源码 Makefile LLVM_CONFIG ? llvm-config #CXX : clang ifndef VERBOSE QUIET : endifSRC_DIR ? $(PWD) LDFLAGS $(shell $(LLVM_CONFIG) --ldflags) COMMON_FLAGS -Wall -Wextra CXXFLAGS $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags) LCXX :$(shell $(L…

前端面试题 ===> 【JavaScript - 高级】

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战今年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 JavaScr…

【MGR】MySQL Group Replication 中文官方文档

MySQL 组复制官方文档翻译 背景: 由于中文版的官方文档应该是通过谷歌翻译直接进行翻译,读起来晦涩难懂,刚好最近在调研MGR,所以对官方文档进行了翻译,翻译版本是5.7。 翻译的英文官方文档: Chapter 17 …

百度AI千帆大模型示例代码 GO语言版

前端&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Sample</title> </head> <body><label for"textInput">Prompt&#xff1a;</label><i…

Kubernetes基础(二十七)-nodePort/targetPort/port/containerPort/hostPort

1 nodePort/targetPort/port/containerPort 1.1 实现层级 1.2 配置方式 ########service########### apiVersion: v1 kind: Service metadata: labels: name: app1 name: app1 namespace: default spec: type: NodePort ports: - <strong>port: 8080 t…

基于C#开发OPC DA客户端——搭建KEPServerEX服务

简介 OPC DA (OLE for Process Control Data Access) 是一种工业自动化领域中的通信协议标准&#xff0c;它定义了应用程序如何访问由OPC服务器提供的过程控制数据。OPC DA标准允许软件应用程序&#xff08;客户端&#xff09;从OPC服务器读取实时数据或向服务器写入数据&…

python:pyecharts 画基金净值 月K线图

pip install pyecharts1.9.1 pyecharts-1.9.1-py3-none-any.whl 我想在本地&#xff08;PC) 画出 基金净值 月K线图&#xff0c;不想每次看图都需联网。 cd my_dir mkdir echarts cd echarts curl -O https://assets.pyecharts.org/assets/echarts.min.js 修改一下开源代码 …

题目 1041: [编程入门]宏定义之找最大数

问题描述&#xff1a; 分别用函数和带参的宏&#xff0c;从三个数中找出最大的数。 样例输入&#xff1a; 1 2 3 样例输出&#xff1a; 3.000 3.000 代码分析&#xff1a; 函数与宏的使用&#xff1a; 函数 max() 用于找出三个实数中的最大值&#xff0c;通过比较大小并…

记录前端面试的一些笔试题(持续更新......)

文章目录 js相关数组去重数组对象去重 实现数组unshift数组扁平化tree型数据扁平化list数据转tree型数据 对象深拷贝防抖/节流函数柯里化函数管道 随便记录一些&#xff0c;面试或者工作中都会用到&#xff0c;实现的方法很多&#xff0c;这里只是一小部分&#xff0c;有更好的…