Python實現php serialize函數

不同的程式語言之間物件的傳遞,就必須把物件序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字串,可以被所有語言讀取,也可以方便地儲存到磁碟或者通過網路傳輸。

舉例A公司用php撰寫後序列化(物件轉字串)傳送到B公司,而B公司用Python反序列化時要用到。
通常是用在Python編程環境和PHP編程環境,相互之間需要進行數據交換時。

pip3 install phpserialize

導入庫:

import phpserialize

利用dumps 進行序列化(物件轉字串):

phpserialize.dumps(vary)

使用loads 進行反序列化(字串轉物件):

phpserialize.loads(formated_string)

來源1

Python並發編程的三種方式

1.多進程(Process)
2.多協程(Coroutine)
3.多線程(Thread)

1.什麼是CPU密集型計算、IO密集型計算?

bound在這邊是限制的意思。
CPU密集型(CPU-bound):
CPU密集型也叫計算密集型,指的是I/O在很短的時間就可以完成,CPU需要大量的計算和處理。特點是CPU占用率極高。
例如:壓縮/解壓縮、加密/解密、正則表達式搜索。

IO密集型(I/O-bound):
指的是系統運作大部分的狀況CPU在等I/O的讀寫。CPU占用率相對的會較低。
例如:文件處理、爬蟲網路、讀寫數據庫。

小總結:
若程式依賴大量的外部連結(內存、硬碟、網路、DB..等等外部連結)就是IO密集型。若其他的只在CPU運算,則是CPU密集型。

2.多進程、多線程、多協程的對比

這三個是有一個級聯關係的。一個進程中可以包含和啟動多個線程,一個線程中可以啟動多個協程。
協程的概念比較新,在任務中可以啟動很多的協程,但本身都在一個線程中進行。

多進程Process(multiprocessing)

  • 優點:可以利用多核CPU並行運算
  • 缺點:占用資源最多,可啟動數目比線程少
  • 適用於:CPU密集型計算

多線程Thread(threading)

  • 優點:相比進程,更輕量級,占用的資源更少。
    這裡的資源指的是每個線程運行都要包含自己的一些變量存儲,存儲到內存區域
  • 缺點:
    相比進程:多線程只能併發執行,不能利用多CPU(GIL-全局解釋器鎖)
    相比協程:啟動數目有限制,佔用內存資源,有線程切換開銷
  • 適用於:IO密集型計算、同時運型的任務數木要求不多

多協程Coroutine(asycio) – 異步io

  • 優點:內存開銷最少,啟動協程數量最多(甚至到幾萬個)。
  • 缺點:支持的庫有限制(aiohttp vs requests)、代碼實現複雜。
    目前有很多技術是不支持協程的,例如requests這個爬蟲常用的類庫,但在python協程中是不支持的,
    所以要用協程來進行爬蟲的話,可以用aiohttp。
    相比進程、線程,代碼實現複雜,且要考慮的點也較多。
  • 適用於:IO密集型計算、需要超多任務運行、但有現成庫支持的場景。

3.如何根據任務選擇對應的技術?

來源:youtube
蚂蚁学Python【Python并发编程】怎样选择多线程多进程多协程

Python 2.7以及Python Virtual Environment – 安裝

因ubuntu從18.04開始,內建的python版本都是為3.6以上 (舊的內建2.7),所以要手動輸入版本號

安裝python2.7

sudo apt update
sudo apt install python2.7 -y

檢查一下python2.7版本:

python2.7 -V

輸出結果:

安裝pip套件

這邊的作法是下載get-pip.py來安裝。

注意:
第3行的URL不一定是最新的,若有跳出錯誤訊息是URL找不到,請自行更換成錯誤訊息跳出的URL。

cd ~
cd 下載
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python2.7 get-pip.py 

若安裝成功,最後會看到這個訊息:

(可略過不做)
為使用pip套件建立別名:
後面的指令pip2請自行改成python2.7 -m pip

cd ~
touch .bash_aliases
echo "alias pip2='python2.7 -m pip'" >> .bash_aliases
source .bash_aliases
pip2 -V

輸出結果:

pip 20.3.4 from /home/ubuntu/.local/lib/python2.7/site-packages/pip (python 2.7)

使用pip安裝virtualenv

日後為每個專案製作一個專屬的python environment

pip2 install virtualenv
# 等同於 python2.7 -m pip install virtualenv

為virtualenv製作別名

這是因為如果安裝其他python版本的virtualenv,用別名來區分使用的版本。也可以略過,後續指令virtialenv2.7自行替換成virtualenv

echo "alias virtualenv2.7='python2.7 -m virtualenv'" >> ~/.bash_aliases
source .bash_aliases
# 測試一下
virtualenv2.7 --version
# 輸出結果
# virtualenv 20.4.3 from /home/ubuntu/.local/lib/python2.7/site-packages/virtualenv/__init__.pyc

製作一個test_venv專屬的python environment。

mkdir python27_venv
cd python27_venv
virtualenv2.7 test_venv  # 方法1:有製作別名(上方操作)才可使用此方法
python27_venv python2.7 -m virtualenv test_venv  # 方法2

創建完後進入虛擬環境:

source ~/python27_venv/test_venv/bin/activate
# 命令列多出前綴(test_venv)。表示已經啟用此虛擬環境
(test_venv)$ python -V
Python 2.7.17 # 輸出結果
(test_venv)$ pip list
# 離開虛擬環境
(test_venv)$ deactive

# 前綴消失,表示已經關閉虛擬環境

ubuntu背景執行py方法

主要介紹在linux下使用Terminal來背景執行python的幾種方式,
一個用python寫的監控腳本test.py,一直運行,每5秒、10秒、15秒顯示一次現在時間。

以下為test.py、test2.py、test3.py這三隻同時使用背景來執行的畫面。

執行test.py後,會顯示跳出PID為25270。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 1
    sleep(5)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

再執行一隻test2.py,不會讓原本的test.py停住,還是會繼續執行,並且顯示新的PID。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 2
    sleep(10)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

再執行test3.py。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 3
    sleep(15)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

查詢一下背景運行的程式有哪些。

ps -ef

想停止某隻程式的話,就輸入:

kill PID


kill掉後原本的Terminal會出現已終止某隻程式。

原本的test2.py和test3.py還會繼續執行。