并发:看起来像同时运行就是并发

并行:同一时间同时被执行叫做并行,最大并行数就是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多进程单线程+协程实现高并发的更多相关文章

  1. python多进程与协程

    1.进程的概念 什么是进程->CPU在同一时刻只能处理一个任务,只是因为cpu执行速度很快. cpu在各个任务之间来回的进行切换. 进程的概念:正在进行的一个过程或者说一个任务,而负责执行任务的 ...

  2. Python 多进程 多线程 协程 I/O多路复用

    引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...

  3. python 多进程/多线程/协程 同步异步

    这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事 ...

  4. 用协程实现高并发I/O(async)

    对于并发要求比较法的I/O需求,可以用python的协程去处理. 重点: 1启动协程必须做一次函数调用 2协程激活只占用1kb内存,所以协程很多也问题不大 3这种效果需要使用关键字async和awai ...

  5. python 多进程和协程配合使用

    一.需求分析 有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录.现在需要读取这些txt文件,判断key是否在数据仓库中.(redis或者mysql) 为空的记录,需要写入到日志文 ...

  6. web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)

    知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...

  7. Python多线程、多进程和协程的实例讲解

    线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...

  8. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  9. Python爬虫 | 多线程、多进程、协程

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...

随机推荐

  1. learning docker steps(9) ----- arm linux docker 安装

    参考:https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1 想要在arm linux上安装docker ...

  2. 2019ICPC上海网络赛 A Lightning Routing I 点分树(动态点分治)+线段树

    题意 给一颗带边权的树,有两种操作 \(C~e_i~w_i\),将第\(e_i\)条边的边权改为\(w_i\). \(Q~v_i\),询问距\(v_i\)点最远的点的距离. 分析 官方题解做法:动态维 ...

  3. linux如何查看ip地址

    使用命令: ifconfig -a 例如:

  4. ORA-28000

    oracle11g中默认设置了 “FAILED_LOGIN_ATTEMPTS=10次”,当输入密码错误次数达到设置值将导致此,该用户会自动锁住. 1. conn sys/oracle as sysdb ...

  5. vga转HDMI与hdmi转VGA区别

  6. python pip 使用

    一.修改 pip 源 Windows 在用户目录下新建 pip\pip.ini 文件,如:C:\Users\Administrator\pip\pip.ini [global] index-url = ...

  7. 数据库 | SQL查询&LIMIT的用法

    body{ text-align:left; width:80%; margin:10px 100px; } 前言 select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此 ...

  8. P4095 [HEOI2013]Eden 的新背包问题

    P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...

  9. Android 美团Robust热更新 使用入门

    Android热更新方案Robust 相信很多人都认识了解过 热修复.热更新.热补丁(对于这个技术也没有特别标准的一种叫法,下面我统一叫热更新),之后的一年里,各种热更新方案如雨后春笋般出现,比较耳熟 ...

  10. Tween(补间)动画

    视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置.大小.旋转.透明度).譬如,如果你有一个TextView对象,您可以移动.旋转.缩放.透明度设置其文本,当然,如果它有 ...