python中使用多線程改進(jìn)flask案例
前言:
線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實體.
與進(jìn)程的區(qū)別:
- (1) 地址空間:進(jìn)程內(nèi)的一個執(zhí)行單元;進(jìn)程至少有一個線程;它們共享進(jìn)程的地址空間;而進(jìn)程有自己獨立的地址空間;
- (2) 資源擁有:進(jìn)程是資源分配和擁有的單位,同一個進(jìn)程內(nèi)的線程共享進(jìn)程的資源
- (3) 線程是處理器調(diào)度的基本單位,但進(jìn)程不是.
- (4) 二者均可并發(fā)執(zhí)行.
簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程.
線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
另外,進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
1.線程和進(jìn)程關(guān)系?
? 進(jìn)程就是一個應(yīng)用程序在處理機(jī)上的一次執(zhí)行過程,它是一個動態(tài)的概念,而線程是進(jìn)程中的一部分,進(jìn)程包含多個線程在運(yùn)行。
? 多線程可以共享全局變量,多進(jìn)程不能。多線程中,所有子線程的進(jìn)程號相同;多進(jìn)程中,不同的子進(jìn)程進(jìn)程號不同。
? 進(jìn)程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位.
? 線程是進(jìn)程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運(yùn)行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
? 一個線程可以創(chuàng)建和撤銷另一個線程;同一個進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行.
下面來介紹具體的多線程改進(jìn)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.多進(jìn)程
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()
到此這篇關(guān)于使用多線程改進(jìn)flask案例的文章就介紹到這了,更多相關(guān)多線程改進(jìn)flask內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)雙進(jìn)程防止單點故障實例深度探究
在分布式系統(tǒng)中,確保系統(tǒng)的高可用性是至關(guān)重要的,本文將深入探討如何使用Python實現(xiàn)雙進(jìn)程自我保護(hù)機(jī)制,以應(yīng)對單點故障,確保系統(tǒng)穩(wěn)定運(yùn)行,將通過詳實的示例代碼,介紹雙進(jìn)程自我保護(hù)的原理、實現(xiàn)步驟以及可能遇到的挑戰(zhàn)2024-01-01Python數(shù)據(jù)結(jié)構(gòu)之樹的全面解讀
數(shù)據(jù)結(jié)構(gòu)中有很多樹的結(jié)構(gòu),其中包括二叉樹、二叉搜索樹、2-3樹、紅黑樹等等。本文中對數(shù)據(jù)結(jié)構(gòu)中常見的樹邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)進(jìn)行了匯總,不求嚴(yán)格精準(zhǔn),但求簡單易懂2021-11-11Python使用Keras庫中的LSTM模型生成新文本內(nèi)容教程
Python語言使用金庸小說文本庫,對文本進(jìn)行預(yù)處理,然后使用Keras庫中的LSTM模型創(chuàng)建和訓(xùn)練了模型,根據(jù)這個模型,我們可以生成新的文本,并探索小說的不同應(yīng)用2024-01-01Python編程使用matplotlib挑鉆石seaborn畫圖入門教程
這篇文章主要為大家介紹了Python編程中使用matplotlib繪圖包來挑出完美的鉆石,本篇是seaborn包畫圖使用入門篇,有需要的朋友可以借鑒參考下2021-10-10