python多进程单线程+协程实现高并发
并发:看起来像同时运行就是并发
并行:同一时间同时被执行叫做并行,最大并行数就是CPU核数
协程不是实实在在存在的物理基础和操作系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU资源的一种方法,在IO密集型任务中,通过协程,可以让CPU尽可能多的时间在本程序上执行,由于协程的原理是遇到IO及让cpu去执行其他代码,不停的来回切,在基于socket TCP通信中,这便为并发提供了土壤,使得单线程也能实现并发
下面我们就来看下如何通过服务端开多线程和协程实现高并发
服务端:
import socket
from multiprocessing import Process,current_process
from gevent import monkey;monkey.patch_all()
from gevent import spawn
def frist():
s = spawn(task) # 遇到IO即切走执行其他线程
s.join() # 等待spawn走完再往下走 def task():
server = socket.socket()
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
IP_port = ("127.0.0.1",52334)
server.bind(IP_port)
server.listen(5)
while True:
con, addr = server.accept()
print(addr,"已连接")
spawn(union,con) def union(con):
while True:
try:
msg = con.recv(1024)
print(msg.decode("utf-8"))
con.send(msg.upper())
except BaseException:
break
con.close() if __name__ == '__main__':
for i in range(1,50):
p = Process(target=frist) # 开启50个进程
p.start()
每一个进程都会在accept()和recv()处来回切换执行并死循环,这已经可以抗住一定的并发量
然后开启了49个进程,也就是说复制了以上的49份执行单位,可想而知单台计算机可抗并发已经非常充分的利用到了cpu资源
下面看客户端代码:
import socket
from threading import Thread,current_thread def task():
client = socket.socket()
IP_port = ("192.168.11.161", 52334)
client.connect(IP_port)
while True:
try:
msg = current_thread()
client.send(str(msg).encode("utf-8"))
a = client.recv(1024)
print("a",a.decode("utf-8"))
except BaseException:
break
client.close() if __name__ == '__main__':
for i in range(1,2000):
s = Thread(target=task)
s.start()
客户端开启了2000个线程模拟高并发,由于Cpython有全局解释器锁,这决定了同一进程的所有线程在同一时间只能有1个线程在用CPU资源,这虽然降低了每个线程的执行频率,
但对于计算机来说,2000个执行完还是非常快的,模拟并发完全可以。
在以上的例子中,并发的效果并不能简单的看客户端访问量,而应该关注客户端每一个线程访问两个周期间间隔的时长,如果线程1第一次执行完一次到下一次完整执行完一次的时间较长,那么这样的并发其实并没有多大的参考价值。
给个赞呗~
python多进程单线程+协程实现高并发的更多相关文章
- python多进程与协程
1.进程的概念 什么是进程->CPU在同一时刻只能处理一个任务,只是因为cpu执行速度很快. cpu在各个任务之间来回的进行切换. 进程的概念:正在进行的一个过程或者说一个任务,而负责执行任务的 ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- python 多进程/多线程/协程 同步异步
这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事 ...
- 用协程实现高并发I/O(async)
对于并发要求比较法的I/O需求,可以用python的协程去处理. 重点: 1启动协程必须做一次函数调用 2协程激活只占用1kb内存,所以协程很多也问题不大 3这种效果需要使用关键字async和awai ...
- python 多进程和协程配合使用
一.需求分析 有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录.现在需要读取这些txt文件,判断key是否在数据仓库中.(redis或者mysql) 为空的记录,需要写入到日志文 ...
- web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)
知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...
- Python多线程、多进程和协程的实例讲解
线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- Python爬虫 | 多线程、多进程、协程
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...
随机推荐
- uint128_t 添加 c++ 重载类型强制转换
类型声明: class uint128 { public: uint128() :hi(), lo(){} uint128(uint32_t l) :hi(), lo(l){} uint128(int ...
- OBDSTAR X300 PRO3详细评论
OBDSTAR 公司的X300 PRO3钥匙主控系统具有SKP900的防盗锁钥匙编程功能,以及新功能,例如,测速计调节,EEPROM / PIC和OBDII.它的风格完全符合工业惯例,例如,它采用双边 ...
- import torch错误解决
import torch出现 ”from torch._C import * ImportError: DLL load failed: 找不到指定的模块“错误这里torch=1.0.1,torchv ...
- Mybatis源码学习之parsing包(解析器)(二)
简述 大家都知道mybatis中,无论是配置文件mybatis-config.xml,还是SQL语句,都是写在XML文件中的,那么mybatis是如何解析这些XML文件呢?这就是本文将要学习的就是,m ...
- matlab 计算灰度图像的一阶矩、二阶矩、三阶矩
一阶矩,定义了每个颜色分量的平均强度 二阶矩,反映待测区域颜色方差,即不均匀性 三阶矩,定义了颜色分量的偏斜度,即颜色的不对称性 close all;clear all;clc; ...
- AGC032E modulo pairing
题意 原题 给出\(2n\)个\(\leq m\)的数,求最优的两两配对方案 使\(n\)组\((x,y)\)的\((x+y)mod \space m\)最大值最小 \(n\leq 10^5,m \l ...
- find命令计算代码行数
[anonymous@localhost ~/lvs/ipvsadm- -regex '.*Makefile.*' -o -regex '.*\.[ch]' -exec cat {} \; | wc ...
- 关于AngularJS与其他前端框架混合使用的思考
AngularJS 是一个为动态WEB应用设计的结构框架,拥有双向数据绑定,模板,MVVM,依赖注入,指令5大优点,Angular最有诱惑力的就是数据绑定功能,使用MVC模式进行开发,Angular在 ...
- 理解Cookie和Session
HTTP 无状态协议 HTTP 本身是一个无状态的连接协议,无状态的意思是:每条请求/响应都是独立进行的,服务端每处理完一个客户端的请求之后就会断开连接,并且每条请求/响应与其之前(或之后)的请求/响 ...
- A*算法解决15数码问题_Python实现
1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...