1.提交任务得方式:
同步:提交完任务,等结果,执行下一个任务
异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数
2.同步不等于阻塞:
阻塞:遇到io,自己不处理,os会抢走cpu ,解决办法:监测到io,gevent切换到其他任务,类似欺骗os
非阻塞:cpu 运行
3.IO分类:
1.阻塞IO blocking IO
2.非阻塞IO nonblocking IO
3.IO多路复用 IO multiplexing
4.信号驱动IO signal driven IO 用得比较少
5.异步IO asynchronous IO
4.network io
涉及到两个系统对象:
1.调用这个io的进程(process/thread)
2.系统内核(kernel)
操作涉及到两个阶段:
1.等待数据准备
2.将数据从内核拷贝到进程中
5.阻塞io: 

并发编程 - io模型 - 总结

    blocking IO的特点:
在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了.
socket编程:
几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的.

            并发编程 - io模型 - 总结

    
  解决方案:
多线程/线程池,可以解决小规模的服务请求;面对大规模的服务请求,多线程模型也会遇到瓶颈,用非阻塞接口来解决.
 1 from socket import *
 2 from threading import Thread
 3 
 4 def communicate(conn):
 5     while True:
 6         try:
 7             data = conn.recv(1024)
 8             if not data: break
 9             conn.send(data.upper())
10         except ConnectionResetError:
11             break
12 
13     conn.close()
14 
15 server = socket(AF_INET, SOCK_STREAM)
16 server.bind(('127.0.0.1',8080))
17 server.listen(5)
18 
19 while True:
20     print('starting...')
21     conn, addr = server.accept()  # io 阻塞 os拿走了cpu
22     print(addr)
23 
24     t=Thread(target=communicate,args=(conn,))
25     t.start()
26 
27 server.close()
server

相关文章:

  • 2022-02-15
  • 2022-12-23
  • 2022-12-23
  • 2021-10-09
  • 2021-08-29
猜你喜欢
  • 2021-12-30
  • 2021-10-07
  • 2021-10-02
  • 2021-05-18
相关资源
相似解决方案