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就启动了 ...
随机推荐
- openstack使用
管理员登陆: 身份管理--->创建项目 身份管理--->创建用户(角色:_member_)(管理指定项目) 管理员--->云主机类型--->创建云主机 管理员--->镜像 ...
- Docker 阿里云镜像加速
1.进入阿里云镜像加速页面: https://cr.console.aliyun.com/#/accelerator 2.修改/etc/docker/daemon.json文件配置,没有则新建: ? ...
- import torch错误解决
import torch出现 ”from torch._C import * ImportError: DLL load failed: 找不到指定的模块“错误这里torch=1.0.1,torchv ...
- Restorator 2018 v3.90汉化注册版 含注册码汉化激活教程
链接:https://pan.baidu.com/s/1wfh5VQfNgbDr-glezL4faQ 提取码:y507
- ida 下载
链接:https://pan.baidu.com/s/1Rs2UOSfroBGf_MIkJv0cGw 提取码:kjqd 官网:https://www.hex-rays.com/updida.shtml
- JavaWeb_(Mybatis框架)使用Mybatis对表进行增、删、改、查操作_二
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- vue 源码解析computed
计算属性 VS 侦听属性 Vue 的组件对象支持了计算属性 computed 和侦听属性 watch 2 个选项,很多同学不了解什么时候该用 computed 什么时候该用 watch.先不回答这个问 ...
- 2016 Multi-University Training Contest 1 部分题解
第一场多校,出了一题,,没有挂零还算欣慰. 1001,求最小生成树和,确定了最小生成树后任意两点间的距离的最小数学期望.当时就有点矛盾,为什么是求最小的数学期望以及为什么题目给了每条边都不相等的条件. ...
- go面试
**1**.简述golang中make和new的区别 make用于内建类型(只能用于创建map.slice 和channel)的内存分配.并且返回一个有初始值(非零)的T类型,而不是*T. new用于 ...
- 使用docker部署mysql主从复制集群
一.环境搭建 虚拟机环境:centos7 IP: 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和3309 docker pull mysql:5.7 doc ...