并发编程(五),flask使用多进程,以及异步I/O的使用

目录

falsk使用多进程

python 实现异步I/O

异步I/O介绍

如何在python中实现异步I/O

使用异步I/O案例

信号量控制协程并发度

falsk使用多进程

from concurrent.futures import ProcessPoolExecutor
import flask, time, json

app = flask.Flask(__name__)

def is_prime():
    for i in range(0, 100):
        i *= i

@app.route('/', methods=['POST'])
def func():
    start = time.time()
    pool.submit(is_prime)
    end = time.time()
    return json.dumps({'成功': end - start})

if __name__ == '__main__':
    pool = ProcessPoolExecutor()  # 进程池对象必须在所有函数生成时建立
    app.run()

python 实现异步I/O

异步I/O介绍

单线程爬取:

并发编程(五),flask使用多进程,以及异步I/O的使用

单线程爬取,如果遇到I/O操作将会阻塞,I/O结束继续执行。

协成:在单线程内实现并发,因为本身就是线程,所以消耗资源极少。

核心原理:I/O的多路复用,遇到I/O操作切换。

Greenlet遇到I/O手动切换:

协成之所以快是因为遇到I/O操作就切换

Gevent模块仅仅是对greenlet 的再封装,将I/O间的手动切换变为自动切换

asyncio: 和grevent一样是基于python实现的。

I/O的多路复用:

并发编程(五),flask使用多进程,以及异步I/O的使用

比如用户想读取QQ的聊天记录,用线程来做,需要先将磁盘里的数据读取到内核中,然后在将数据从内核空间中读取到用户空间,然后等待即可。用协程来做的时候,将数据从内核读取的时候会用内核维护一个链表,存放socket连接,socket内部维护了1024个socket套接字,select方法会不断去轮询所负责的所有socket,当某个socket有数据达到时,就通知用户进程。用户就会循环这些套接字,找出哪些里面有内容,把数据给用户空间。

简单点来说:协成在遇到I/O时会切换到下一个任务去执行,协成会用内核维护一个链表将I/O操作存起来,当I/O操作执行完毕后会通知协成来拿取数据。

Select poll epoll

Select:目前几乎在所有平台上支持,跨平台好是它的特点,监听文件描述符数量有限制,Linux是1024,监控socket时不能准确告诉用户是哪个。

Poll 和select本质上没有太大区别,但是poll没有最大描述符数量限制

Epoll 没有描述符限制,也能精确匹配用户。Linux下性能最好的多路io就绪通知方法。内部的 epoll_wait直接检查链表是不是空就知道是否有文件描述符准备好了。

Original: https://blog.csdn.net/xubishenghua/article/details/120394008
Author: 两三行#
Title: 并发编程(五),flask使用多进程,以及异步I/O的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/746621/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球