python中使用多线程改进flask案例
前言:
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
- (1) 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
- (2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
- (3) 线程是处理器调度的基本单位,但进程不是.
- (4) 二者均可并发执行.
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
1.线程和进程关系?
? 进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。
? 多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。
? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
? 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
下面来介绍具体的多线程改进flask项目案例!!!
2.多线程
import flask import json import time from concurrent.futures import ThreadPoolExecutor app = flask.Flask(__name__) pool = ThreadPoolExecutor() def read_file(): time.sleep(0.1) return "file result" def read_db(): time.sleep(0.2) return "db result" def read_api(): time.sleep(0.3) return "api result" @app.route("/") def index(): result_file = pool.submit(read_file) result_db = pool.submit(read_db) result_api = pool.submit(read_api) return json.dumps({ "result_file": result_file.result(), "result_db": result_db.result(), "result_api": result_api.result(), }) if __name__ == "__main__": app.run()
3.多进程
import flask from concurrent.futures import ProcessPoolExecutor import math import json app = flask.Flask(__name__) def is_prime(n): if n < 2: return False if n == 2: return True if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True @app.route("/is_prime/<numbers>") def api_is_prime(numbers): number_list = [int(x) for x in numbers.split(",")] results = process_pool.map(is_prime, number_list) return json.dumps(dict(zip(number_list, results))) if __name__ == "__main__": process_pool = ProcessPoolExecutor() app.run()
栏 目:Python代码
本文地址:http://www.codeinn.net/misctech/218093.html