内容目录:

1.socket服务端实现并发

2.进程池,线程池

3.协程

4.IO模型

1.socket服务端实现并发

# 客户端:

import socket

client = socket.socket()

client.connect(('127.0.0.1', 8080))

while True:

data = input('>>>:').encode('utf-8')

if len(data) == 0: continue

client.send(data)

res = client.recv(1024)

print(res)

# 服务端:

"""

1.固定的ip和端口

2.24小时不间断提供服务

3.支持高并发

"""

import socket

from threading import Thread

server = socket.socket()

server.bind(('127.0.0.1', 8080))

server.listen(5)

def trans_data(conn):

while True:

try:

data = conn.recv(1024)

if len(data) == 0: break

print(data)

conn.send(data.upper())

except ConnectionResetError:

break

conn.close()

while True:

conn, addr = server.accept()

print(addr)

t = Thread(target=trans_data, args=(conn,))

t.start()

2.进程池、线程池

"""

无论是开线程还是开进程,其实都会消耗资源,开线程消耗的资源比开进程的小

池:

1.为了减缓计算机硬件的压力,避免计算机硬件设备崩溃

2.虽然减轻了计算机硬件的压力,但一定程度上降低了持续的效率

进程池、线程池:

为了限制开设的进程数和线程数,从而保证计算机硬件的安全

"""

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

import time

# 实例化池对象 --线程池

# 不指定参数的情况下,默认为当前计算机cpu个数乘以5,也可指定线程个数

pool1 = ThreadPoolExecutor(20)

# 实例化池对象 --进程池

# 不指定参数的情况下,默认为当前计算机cpu个数,也可指定进程个数

pool = ProcessPoolExecutor(20)

# pool = pool1 # 为了交换测试两种池

def task(n):

print(n)

time.sleep(2)

return n**2

def call_back(n):

print("拿到结果:%s" % n.result())

"""

提交任务的方式:

同步:提交任务之后,等待任务执行返回结果之后,再进行下一步代码

异步:提交任务之后,不等待任务的返回结果(通过回调函数返回结果),直接执行下一步操作

"""

# 回调函数:异步提交之后一旦任务有返回结果,自动交给另一个去执行

if __name__ == '__main__':

# pool.submit(task,1)

t_list = []

for i in range(20):

pool.submit(task, i).add_done_callback(call_back) # 异步提交任务

# t_list.append(future)

pool.shutdown() # 关闭池子并且等待池子中所有的任务运行完毕

# for p in t_list:

# print('>>>:', p.result())

print('主')

3.协程

"""

进程:资源单位(车间)

线程:最小执行单位(流水线)

协程:单线程,实现并发

并发:看上去像同时运行就可以称之为并发

多道技术:

空间上的复用:硬件上的复用,内存中划分区域存放数据信息

时间上的复用:快速切换

协程:认为创造的专业名词

通过代码层面自己监测IO自己实现切换,让操作系统误以为你这个线程没有IO

切换+保存状态就一定能够提升程序效率吗?

不一定,如果任务是计算密集型,反而会降低效率,如果任务是IO密集型,会提升效率。

"""

# 检测代码中所有的IO行为

from gevent import monkey;monkey.patch_all()

from gevent import spawn, joinall # gevent 本身识别不了time.sleep等不属于该模块内的io操作

import time

def play(name):

print('%s play 1' % name)

time.sleep(2)

print('%s play 2' % name)

def eat(name):

print('%s eat 1' % name)

time.sleep(1)

print('%s eat 2' % name)

start = time.time()

g1 = spawn(play, 'lisi')

g2 = spawn(eat, 'lisi')

# g1.join()

# g2.join()

joinall([g1, g2])

print('主', time.time() - start) # 单线程下实现并发,提升效率

"""

# 运行结果:

lisi play 1

lisi eat 1

lisi eat 2

lisi play 2

主 2.013660192489624

"""

4.IO模型

"""

阻塞IO

非阻塞IO (服务端通信针对accept用s.setblocking(False)加异常捕获,cpu占用率过高)

IO多路复用

在只检测一个套接字的情况下,他的效率连阻塞IO都比不上。因为select这个中间人增加了环节。

但是在检测多个套接字的情况下,就能省去wait for data过程

异步IO

"""

java协程处理IO_并发编程 --进、线程池、协程、IO模型相关推荐

  1. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. Java并发编程:线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  3. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  4. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  5. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  6. Java并发编程一线程池简介

    推荐:Java并发编程汇总 Java并发编程一线程池简介 为什么我们需要使用线程池? 我们知道线程是一种比较昂贵的资源,我们通过程序每创建一个线程去执行,其实操作系统都会对应地创建一个线程去执行我们的 ...

  7. Java并发编程一线程池的五种状态

    推荐:Java并发编程汇总 Java并发编程一线程池的五种状态 原文地址 Java多线程线程池(4)–线程池的五种状态 正文 线程池的5种状态:Running.ShutDown.Stop.Tidyin ...

  8. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  9. Java高并发编程:线程池

    这里首先介绍了java5中的并发的小工具包:java.util.concurrent.atomic,然后介绍了线程池的概念,对使用java5的方式创建不同形式的线程进行了演示,之后介绍了两个 对象:C ...

  10. JAVA并发编程8_线程池的使用

    不使用线程池 1.串行执行任务 class SingleThreadWebServer {public static void main(String[] args) {ServerSocket so ...

最新文章

  1. 取值范围_从int取值范围谈起
  2. 解题报告:P5960 【模板】差分约束算法(及常用技巧)
  3. 9.1 图像处理的基本概念(图像读入、图像信息查询、图像显示和图像存储)
  4. (静态资源处理)nginx 比tomcat强在哪
  5. join orcl的left_Oracle关联查询关于left/right join的那点事
  6. 原生JS封装自己的AJAX
  7. swfobject.embedSWF属性与用法
  8. HTTP服务器的本质:tinyhttpd源码分析及拓展
  9. 华为云TaurusDB性能挑战赛-java赛题mvn编译时报错:不支持 diamond 运算符
  10. 头像上传html js版,javascript头像上传代码实例
  11. nodejs中的模块的理解
  12. Kotlin — 适用于Android 开发
  13. 快速搜索Wox工具之Everything Client没有运行报错,解决办法!
  14. dcos 1.7 目录挂载测试
  15. 超硬核!华为智慧屏上的家庭相册竟可以自动精准分类?
  16. java游戏丛林奇兵_丛林奇兵游戏下载
  17. QT之TreeView
  18. 为什么少女怀孕越来越普遍
  19. 阿里健康2021实习生招聘
  20. 立冬养生,残秋尽,冬未隆,正是养藏时

热门文章

  1. springboot日志框架
  2. Cocos2d-x schedulers 定时器
  3. (转)为什么用ls和du显示出来的文件大小有差别?
  4. burpsuite上传截断拿shell
  5. Linux CentOS上用iptables设置防火墙遇到的问题
  6. Openlayers 杂项
  7. configserver配置中心三种配置方式
  8. Hibernate异常归总
  9. Exception:No identifier specified for entity
  10. 微信小程序电商实战-购物车(下)