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

并行:同一时间同时被执行叫做并行,最大并行数就是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. Spring Security 自定义 登陆 权限验证

    转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...

  2. luogu 4234 最小差值生成树 LCT

    感觉码力严重下降~ #include <bits/stdc++.h> #define N 400006 #define inf 1000000000 #define setIO(s) fr ...

  3. Cogs 728. [网络流24题] 最小路径覆盖问题

    [网络流24题] 最小路径覆盖问题 ★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件 时间限制:1 s 内存限制:128 MB 算法实现题8-3 最小路径覆盖问题(习题8-1 ...

  4. 无法连接虚拟设备 ide1:0及上不网

    无法连接虚拟设备 ide1:0 问题: 启动vmware之后,发现出现无法连接 ide 1:0. 网络查找之后,发现是之前挂载的iso镜像找不到了. 原因: 我把iso镜像放到其他位置. 解决: 指定 ...

  5. td中文字居中

    <style> .table_style{width: 100%;height: auto;} .table_style tr td{text-align: center;vertical ...

  6. 苹果系统OSX中Automator批量重命名

    Automator,看字面意思就无比强大,[自动机器].有什么能比自动还让人着魔? 答案是没有✔ 如果你用的是mac,如果你有一堆文件要重新整理命名,如果你还在Goole什么"批量重命名软件 ...

  7. Java学习回顾总结

    java-01初识Java见上一篇 Java-02 1.命名规范与规范: 标识符命名规则:首字母为字母|下划线|$ 其余部分数字|字母|下划线|$ 命名规范: 变量属性方法命名规范:第一个单词首字母小 ...

  8. MAC-下安装php-redis扩展

    MAC下安装php-redis扩展   下载php-redis,地址:https://nodeload.github.com/nicolasff/phpredis/zip/master 下载完成得到p ...

  9. mysql授权指定ip远程登录

    use user //更新用户表: UPDATE `user` SET `Host` = '175.6.6.230' where `Host` = '175.6.6.230'; //授权用户表: GR ...

  10. Rsa加密类

    需要导入Base64.jar包 import java.io.ByteArrayOutputStream; import java.security.Key; import java.security ...