單雙線程的理解 和 lua基礎語法

1.什么是單進程 ,什么是多進程

當一個程序開始運行時,它就是一個進程,進程包括運行中的程序和程序所使用到的內存和系統資源。而一個進程又是由單個或多個線程所組成的。

1.1 ?像apache ?nginx 這類 服務器中間件就是多進程的軟件 , cpu會使用多個進程完成用戶的操作請求。

>> ps aux | grep httpd
apache   18352  0.0  4.4 1833072 84584 ?       Sl   03:27   0:00 /usr/local/apache/bin/httpd -k start
apache   18353  0.0  4.3 1837212 82128 ?       Sl   03:27   0:00 /usr/local/apache/bin/httpd -k start
apache   22655  0.0  1.5 777480 29676 ?        Ss   Aug20   1:31 /usr/local/apache/bin/httpd -k start
apache   23640  0.0  6.2 1839004 117148 ?      Sl   14:07   0:00 /usr/local/apache/bin/httpd -k start
apache   24321  0.1  7.1 1838872 135012 ?      Sl   15:39   0:00 /usr/local/apache/bin/httpd -k start

1.2 像 redis ,lua這類軟件就是單進程的 ,無論再多的操作請求 ,cpu只會生成一個進程來處理事情。

>> ps aux | grep redis
root     22931  0.1  0.0 140916  1472 ?        Ssl  Aug20  27:40 ./redis-server *:88888

2. 單線程 ?和 多線程怎么理解

線程是程序中的一個執行流,每個線程都有自己的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數。

2.1 什么是多線程?

多線程是指程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個并行執行的線程來完成各自的任務。

2.2 多線程的好處和壞處

好處:可以提高CPU的利用率。在多線程程序中,一個線程必須等待的時候,CPU可以運行其它的線程而不是等待,這樣就大大提高了程序的效率。

壞處:當然多線程也有壞處,因為線程也是程序,所以線程需要占用內存,線程越多占用內存也越多;多線程需要協調和管理,所以需要CPU時間跟蹤線程;線程之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題;線程太多會導致控制太復雜,最終可能造成很多Bug;

2.3 單線程 和 多線程的區別

生活舉例

你早上上班,正要打卡的時候,手機響了。。你如果先接了電話,等接完了,再打卡,就是單線程。

如果你一手接電話,一手打卡。就是多線程。

2件事的結果是一樣的。。你接了電話且打了卡。

3. lua+redis為什么能解決高并發超賣 ,應用場景

        $REDIS_REMOTE_HT_KEY         = "product_%s";     //共享信息key$REDIS_REMOTE_TOTAL_COUNT    = "total_count";    //商品總庫存$REDIS_REMOTE_USE_COUNT      = "used_count";     //已售庫存$script = <<<eoflocal key = KEYS[1]local field1 = KEYS[2]local field2 = KEYS[3]local field1_val = redis.call('hget', key, field1)local field1_val = tonumber(field1_val)local field2_val = redis.call('hget', key, field2)local field2_val = tonumber(field2_val)if(field1_val>field2_val) thenreturn redis.call('HINCRBY', key, field2,1)endreturn 0
eof;$objRedis = new \Redis();$objRedis->connect('127.0.0.1',6379);$objRedis->auth('1234');$r = $objRedis->eval($script,array($REDIS_REMOTE_HT_KEY,$REDIS_REMOTE_TOTAL_COUNT,$REDIS_REMOTE_USE_COUNT),3);if($r==0){echo '商品已經買完了哦...';...}
        

上面的是lua+redis防止超賣的 php 代碼片段 , 我們預先在服務器上設置了?商品總庫存?total_count 為 100

./ab  -n 300 -c 300 'http://127.0.0.1/'

測試300個并發。可以看到最終?已售庫存?used_count ,剛好是100 ,并沒有出現超賣的現象

為什么lua+redis 能解決 這種超賣現象

1. 原子操作。Redis會將整個腳本作為一個整體執行,中間不會被其他請求插入。因此在腳本運行過程中無需擔心會出現競態條件,無需使用事務。

2. 復用。客戶端發送的腳本會永久存在redis中,這樣其他客戶端可以復用這一腳本,而不需要使用代碼完成相同的邏輯。

4. lua的一些語法基礎

4.1 hello world

print("Hello World!")

不用分號 .

4.2 注釋

--兩個減號是單行注釋:--[[多行注釋多行注釋--]]

4.3 變量

Lua 變量有三種類型:全局變量、局部變量、表中的域。

Lua 中的變量全是全局變量,那怕是語句塊或是函數里,除非用 local 顯式聲明為局部變量。

局部變量的作用域為從聲明位置開始到所在語句塊結束。

變量的默認值均為 nil。

a = 5               -- 全局變量
local b = 5         -- 局部變量function joke()c = 5           -- 全局變量local d = 6     -- 局部變量
endjoke()
print(c,d)          --> 5 nil

這點和php不大一樣,變量C在 function里 ,就是局部的 。 第10行的?print(c,d) 是讀取不大的

4.4 循環

a=10
while( a < 20 )
doprint("a 的值為:", a)a = a+1
end

4.5 控制

要注意的是Lua中 0 為 true

--[ 定義變量 --]
a = 10;--[ 使用 if 語句 --]
if( a < 20 )
then--[ if 條件為 true 時打印以下信息 --]print("a 小于 20" );
end
print("a 的值為:", a);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78931.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】VIM 編輯器,編輯加速引擎

目錄 vim中的五種常見模式介紹VIM的基本操作安裝VIMVIM中的模式切換 VIM指令集命令模式指令集底行模式指令集視圖模式指令集替換和插入模式 end vim中的五種常見模式介紹 正常/普通/命令模式【Normal mode】 控制屏幕光標的移動&#xff0c;字符、字或行的刪除&#xff0c;移動…

【Linux網絡】Socket 編程TCP

&#x1f308;個人主頁&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列專欄&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目錄 TCP socket API 詳解 socket(): bind(): listen(): accept(): connect V0…

記一次 .NET某固高運動卡測試 卡慢分析

一&#xff1a;背景 1. 講故事 年前有位朋友找到我&#xff0c;說他們的程序會偶發性卡慢 10s 鐘&#xff0c;在某些組合下會正常&#xff0c;某些組合下就會出現問題&#xff0c;解釋不了其中的原因&#xff0c;讓我幫忙看下怎么回事&#xff1f;截圖如下&#xff1a; priva…

硬件知識積累 單片機+ 光耦 + 繼電器需要注意的地方

1. 電路圖 與其數值描述 1.1 單片機引腳信號為 OPtoCoupler_control_4 PC817SB 為 光耦 繼電器 SRD-05VDC-SL-A 的線圈電壓為 67Ω。 2. 需注意的地方 1. 單片機的推挽輸出的電流最大為 25mA 2. 注意光耦的 CTR 參數 3. 注意繼電器線圈的 內阻 4. 繼電器的開啟電壓。 因為光耦…

IP組播技術與internet

1.MAC地址分為三類&#xff1a;廣播地址&#xff1b;組播地址&#xff1b;單播地址 2.由一個源向一組主機發送信息的傳輸方式稱為組播。 3.組播MAC地址&#xff0c;第一個字節的最后一位為1&#xff1b; 單播MAC地址&#xff0c;第一個字節的最后一位為0&#xff1b; 4.不能…

vue3+vite+ts使用daisyui/tailwindcss

vite創建vue3腳手架 npm init vitelatest myVue3 – --template vue cd .\myVue3\ npm i npm run dev 安裝tailwindcss/daisyui 依賴安裝 npm install -D tailwindcss postcss autoprefixer daisyui npx tailwindcss init -p 這條命令將生成postcss.config.js(因為加了…

大數據(7)Kafka核心原理揭秘:從入門到企業級實戰應用

目錄 一、大數據時代的技術革命1.1 消息中間件演進史1.2 Kafka核心設計哲學 二、架構深度解構2.1 核心組件拓撲2.1.1 副本同步機制&#xff08;ISR&#xff09; 2.2 生產者黑科技2.3 消費者演進路線 三、企業級應用實戰3.1 金融行業實時風控3.2 物聯網數據管道 四、生產環境優化…

spring boot大文件與多文件下載

一、簡單大文件下載&#xff1a; /*** 下載大文件* param path 路徑* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…

第二節:React 基礎篇-受控組件 vs 非受控組件

一、場景題&#xff1a;設計一個實時搜索輸入框&#xff0c;說明選擇依據 受控組件 vs 非受控組件 核心區別 特征受控組件非受控組件數據管理由React狀態&#xff08;state&#xff09;控制通過DOM元素&#xff08;ref&#xff09;直接訪問更新時機每次輸入觸發onChange提交…

局部路由守衛

局部路由守衛為我們提供了更細粒度的路由控制&#xff0c;允許我們在特定的路由或組件級別添加鑒權和邏輯處理。局部路由守衛分為 path 守衛和 component 守衛&#xff0c;它們分別適用于不同的場景。 path 守衛&#xff08;路由守衛&#xff09; path 守衛用于在進入特定路由…

Android 16應用適配指南

Android 16版本特性介紹 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概覽 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 發布時間 Android 16 適配指南 Google開發平臺&…

android display 筆記(十二)CPU,GPU,DPU的區別

CPU&#xff08;Central Processing Unit&#xff09;通用計算&#xff1a;處理復雜邏輯、分支預測、多任務調度。 低延遲&#xff1a;優先快速響應單線程任務。 GPU&#xff08;Graphics Processing Unit&#xff09; 高吞吐量并行計算&#xff1a;適合大規模數據并行處理。…

音頻轉文本:如何識別音頻成文字

Python腳本:MP4轉MP3并語音識別為中文 以下是一個完整的Python腳本,可以將MP4視頻轉換為MP3音頻,然后使用語音識別模型將音頻轉換為中文文本。 準備工作 首先需要安裝必要的庫: pip install moviepy pydub SpeechRecognition openai-whisper完整腳本 import os from m…

理解 MCP 協議的數據傳遞:HTTP 之上的一層“殼子

以下是以 CSDN 博客的風格記錄你對 MCP 協議數據傳遞的理解和發現&#xff0c;內容涵蓋了 MCP 協議基于 HTTP 的本質、JSON-RPC 的“殼子”作用&#xff0c;以及為什么熟悉 HTTP 協議就足以理解 MCP 的數據傳遞。文章面向技術社區&#xff0c;結構清晰&#xff0c;適合分享。 理…

基于ssm網絡游戲推薦系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 當今社會進入了科技進步、經濟社會快速發展的新時代。國際信息和學術交流也不斷加強&#xff0c;計算機技術對經濟社會發展和人民生活改善的影響也日益突出&#xff0c;人類的生存和思考方式也產生了變化。傳統網絡游戲管理采取了人工的管理方法&#xff0c;但這種管理方…

vue入門:指令

文章目錄 vue的內置指令說明&#xff1a; 自定義指令 vue的內置指令 Vue 指令的本質是&#xff1a; 聲明式的 DOM 操作接口&#xff08;隱藏底層 JavaScript 代碼&#xff09;。響應式數據的綁定媒介&#xff08;連接數據和視圖&#xff09;。模板編譯的標記&#xff08;最終…

oracle 索引失效

在 Oracle 11g 中&#xff0c;索引失效的常見原因包括函數修改列、隱式類型轉換、統計信息過時等&#xff0c;解決方法需結合版本特性&#xff08;如虛擬列、索引跳躍掃描&#xff09;。通過執行計劃分析、統計信息維護和合理使用提示&#xff08;Hints&#xff09;&#xff0c…

k8s藍綠發布

k8s藍綠發布 什么是藍綠部署K8S中如何實現藍綠部署k8s藍綠部署流程圖 什么是藍綠部署 參考: https://youtu.be/CLq_hA0lAd0 https://help.coding.net/docs/cd/best-practice/blue-green.html 藍綠部署最早是由馬丁福勒 2010年在他的博客中提出. 藍綠部署是一種軟件部署策略,用…

stm32面試

數據結構相關問題 stm32面試 數據結構相關問題 目錄基礎數據結構樹與圖排序與查找算法 Linux相關問題Linux系統基礎Linux命令與腳本Linux網絡與服務 操作系統相關問題操作系統基礎概念操作系統調度算法操作系統同步與通信 STM32相關問題STM32硬件基礎STM32編程與開發STM32應用與…

Mybatis 中 mappers標簽 package的使用

MyBatis 的配置文件中&#xff0c;<mappers> 標簽用于指定 MyBatis 應該加載哪些映射器&#xff08;Mapper&#xff09;。其中 package 屬性是一種便捷的方式來批量注冊多個映射器接口 package 屬性允許你指定一個包名&#xff0c;MyBatis 會自動掃描該包下的所有映射器…