關於網路那些事...

Marketing, SEO, Web trends, Programming tutorial, Web design, and Life event...

理解 程序(Process)、執行緒(Thread)、協程(Coroutine) 、生成器(yield) 差異

Process 是電腦中已執行 Program 的實體 每一個 Process 是互相獨立的 同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能 同一個 Process 底下的 Thread 共享資源,如 記憶體、變數等

在多執行緒中(Multithreading),執行緒屬於同步機制,在同時間運行的執行緒,若兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock)

Coroutine的程式概念, 在1958年由Melvin Edward Conway提出, 是一種類似多執行緒的單執行緒程式概念, 且可以避開多執行緒的race condition問題, 因為他是單執行緒!!!, 所以不會有第二個執行緒來搶著操作.

Coroutine Coroutine 屬於非同步機制,在執行過程擁有自己的上下文,同時具有可暫時儲存上下文的機制,當一個 Coroutine 儲存後,執行完其他任務可在重新進入,並且從上一次執行的狀態繼續進行。這樣的功能讓程式可以達到分段執行。

同執行緒的比較 協程非常類似於執行緒。但是協程是協同運作式多工的,而執行緒典型是搶占式多工的。這意味著協程提供並行性而非並列性。協程超過執行緒的好處是它們可以用於硬性即時的語境(在協程之間的切換不需要涉及任何系統呼叫或任何阻塞呼叫),這裡不需要用來守衛關鍵區段的同步性原語(primitive)比如互斥鎖、號誌等,並且不需要來自作業系統的支援。有可能以一種對呼叫代碼透明的方式,使用搶占式排程的執行緒實現協程,但是會失去某些利益(特別是對硬性即時操作的適合性和相對廉價的相互之間切換)。

Yield Yield 又稱為生成器,也叫作「半協程」,屬於協程的子集。他跟 Coroutine 一樣,都可以分段執行,但兩者還是有差別。首先,Coroutine 可以控制接續執行另一個協成,過某一段時間再切回繼續跑。Yield 只能在呼叫時,被呼叫的對象控制,並且只能在該Yield ,無法跳到其他 Coroutine 。但事實並非這麼絕對,其實可透過一些dispatcher 的模式來透過上層以token等方式控制yield,在邏輯上達到切換到其他 Coroutine 。

Continue Reading

GCP 磁碟擴充容量流程 [解決]

查詢磁碟分割

sudo lsblk

>>>輸出
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda      8:0    0  30G  0 disk 
└─sda1   8:1    0  10G  0 part /

分配容量

將剩下的空間都分配給 sda1

(注意,這裡 sda 與 1 之間有空格)

Continue Reading

Linux - CentOS7 安裝 VirtualBox

這裡記錄如何在 CentOS7 安裝 VirtualBox

更新 yum

首先更新系統至最新版本

yum update -y

Continue Reading

Linux - FTP vsftpd 安裝及設定教學

Linux - FTP 教學

在這裡記錄一下 Linux CentOS7 安裝 FTP 以及如何建立使用者,並且限制使用者只能訪問家目錄。

Continue Reading

解決,Nas 透過靜態路由 Gateway 開通不同網段路由

解決,Nas 透過靜態路由 Gateway 開通不同網段路由

目前公司有新添購主機,需要將該台主機可開通連結到多個網段,

這裡先說明一下,在內網 192.168.1.42 已經有設定可連結到多網段。

Nas 網路 192.168.1.49 與該台機器位於同網段,因此,只需要在新添購的 Nas 增加靜態路由,

再透過該路由指定 Gateway 的導向路徑到其他網段 (192.168.77.0) 即可

Continue Reading

CentOS 安裝 Java 與 Maven

CentOS 安裝 Java 與 Maven 流程

安裝JAVA

Java環境檢查,若出現 ```-bash:

CVT2HUGO: java: command not found``` 表示未安裝 JAVA
java -version

下載 JAVA

64x

yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 -y

java -version

安裝 Maven

確認是否存在 maven

mvn -version

安裝 Maven3.6

下載安裝包

wget http://ftp.tc.edu.tw/pub/Apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

解壓縮

tar -zxvf apache-maven-3.6.3-bin.tar.gz

移動Maven目錄

sudo mv apache-maven-3.6.3 /opt

修改Maven目录的User/Group为root

sudo chown -R root:root /opt/apache-maven-3.6.3

以 root 身份登入執行以下命令,設置環境變量

cat > /etc/profile.d/maven.sh <<EOF 

export M2_HOME=/opt/apache-maven-3.6.3
export PATH=\$PATH:\$M2_HOME/bin
EOF

source /etc/profile.d/maven.sh

確認安裝

mvn -version

Continue Reading

Linux Mac, Windows 如何掃描區網IP(IP-Scanner)

Linux Mac, Windows 如何掃描區網IP(IP-Scanner)

這裡記錄如何掃描區網的方式,使用的是系統內建的 ping 與 arp 指令:

Continue Reading

如何在 Mac分享 VPN網路作為 Wi-Fi 熱點分享來源

如何在 Mac分享 VPN網路作為 Wi-Fi 熱點分享來源

近期開發產品,需要再非公司的場合應用到固定IP。

由於這次產品使用的場合無法立即取得固定IP網路環境,並且實體網路也沒有的情況下,進行了幾種方式,最終找到可行的方式。

在這裡將流程進行紀錄。

Continue Reading

Docker build go image

Docker build go image

這裡記錄一下簡易的 Go build image 流程

Continue Reading

最完整 如何解決 .git 檔案過大, git clone 產生 Swap Out of memory 問題

最完整 如何解決 .git 檔案過大, git clone 產生 Swap Out of memory 問題

.git 檔案過大,會需要依照當時專案的環境做不同處理,這裡將各種可能的狀況,提供解決方案。

當 .git 檔案過大,伺服器記憶體不足時,會出現以下錯誤:

swap Out of memory, malloc failed (tried to allocate xxxxxxxxxx bytes)

通常會發生這問題,原因都在於這個 git repository 已經使用一定時間,提交次數非常多,導致 .git 檔案過大

例如,.git 檔案就佔據 2Gb

遇到這狀況時,可能遇到一些問題,例如:主機環境是否能變動,commit 資訊是否要保留等

以下針對各種問題,提供對應的解決方法:

Continue Reading

Python 運行 Selenium 入門

Python 運行 Selenium 入門

這裡支援 Python 2.7, 3.4+

安裝 Driver

下載瀏覽器 driver ,請依照你瀏覽器目前的版本下載對應的 Driver

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

在這裡,我們目前 Chrome 版本是 79.x,因此下載的是 chromedriver 79.x版本,

下載完成後,將 driver 放置環境變數,並且給予執行的權限

sudo cp chromedriver /usr/local/bin
sudo chmod +x /usr/local/bin/chromedriver

Python 安裝 selenium

安裝

pip install -U selenium
//or
pip3 install -U selenium

建立專案

vim test.py

建立爬蟲腳本,前往奇摩首頁,搜尋欄輸入 seleniumhq 後,送出搜尋

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()

browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title

elem = browser.find_element_by_name('p')  # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)

browser.quit()

執行

Continue Reading

Workerman 入門 - 安裝及啟動

Workerman 入門 - 安裝及啟動

Workerma 是一個老牌的 PHP socket 服務架構。

這裡記錄基於 CentOS, PHP7 環境的安裝流程:

Continue Reading

工廠模式 (Factory)

工廠模式 (Factory)

在 Design Pattern 中,工廠模式(Factory) 基本的理念是建構一套完整工廠鍊,可以用來生產各種類別品項。

例如,建構資料庫工廠,可以用來產生 mysql, mongodb, redis…. 等物件。

對於使用者而言,他只需要在初始化工廠時,指定要生產的是什麼,

後續在操作資料庫的行為,都會一致。

Continue Reading

建構者模式 (Builder)

建構者模式 (Builder)

建構者模式,主要透過條件堆疊取得產物。

每一個堆疊的步驟,都是一個 Builder,例如透過 set 的方式來傳入 Builder。

實際用途,可運用在設計資料庫查詢器的功能,例如,要查詢一個用戶,名字為 john

Continue Reading

什麼是繼承抽象 Abstract

Abstract 可以用來定義 Abstract 類、一般方法名稱及參數,Abstract 方法。

一般的方法可以實作邏輯。

如果是 Abstract 方法,則僅作描述,不實作邏輯。邏輯會保留到某個類別繼承(extends)時,來實作(強制)。

透過抽象,可以讓我們定義好規則以及實作一些方法,讓其他類別擴充時,可遵照規則實作,以及直接可使用這些方法。

Continue Reading

Mac 強制移除本地 mysql 佔用 3306,解決無法 kill 3306 process 問題

在本地預計使用docker 建構 mysql ,卻發現 3306 port 被佔用的情況。

這時,透過 刪除指定進程方式,來移除佔用 3306 port 的 process

先將 3306 process 找出,並且移除

Continue Reading

解決,請求過大導致 The request record is too big

解決,請求過大導致 The request record is too big

Nignx & PHP-FPM 架構中,發送單一請求若header傳輸量過大,就會爆出 request record is too big 的錯誤,

可以檢查是否直接透過http params 方式來夾帶參數

當參數過大,就會導致內容無法送達而爆出錯誤。

Continue Reading

Guzzle PUT 傳輸參數方式說明

Guzzle PUT 數據方式說明

使用 Guzzle

使用 Guzzle 只能透過 POST 方式來傳遞 application/x-www-form-urlencoded form params

( 官方原文:form_params - Used to send an application/x-www-form-urlencoded POST request. )

若使用 PUT, DELTE 則需要改用 body 或者 json 格式傳輸,例如:

Continue Reading

npm install -g 後出現 command not found 解決方式

npm install -g 後出現 command not found 解決方式

這裏說明 npm global 安裝完畢出現 command not found 解決方式,以 vue-cli 安裝為例

安裝 vue-cli 流程發生無法從環境變數中直接使用 vue 指令,出現 command not found 或者 sh: vue-cli-service: command not found 該如何解決:

在新主機安裝 vue-cli 之後

npm install -g @vue/cli

在執行版版檢查時,發生 vue: command not found

# vue --version
-ash: vue: command not found

解決這問題的方式如下:

Continue Reading

IP掩碼 32,24,16,8 意思及 Nginx 設定限制IP 僅開放特定IP及允許內部網路訪問

Nginx 設定限制IP 僅開放特定IP及允許內部網路訪問

僅開放公司IP或內部IP訪問,常見設定如下:

Continue Reading