1. 程式人生 > 其它 >程序執行緒協程補充、docker-compose一鍵部署專案、搭建代理池、requests超時設定、認證設定、異常處理、上傳檔案

程序執行緒協程補充、docker-compose一鍵部署專案、搭建代理池、requests超時設定、認證設定、異常處理、上傳檔案

今日內容概要

  • 補充:程序,執行緒,協程
  • docker-compose一鍵部署演示
  • 搭建代理池
  • requests超時設定
  • requests認證設定
  • requests異常處理
  • requests上傳檔案

內容詳細

1、程序,執行緒,協程

# 程序,執行緒,協程
# -程序是資源分配的最小單位
	不是程式--》qq,迅雷程式---》執行一個程式,分配記憶體執行程式
	一個py檔案不一定是一個程序---》py執行在直譯器之上---》一個直譯器是一個程序
	python中Process類開程序---》又拉起了一個直譯器,再執行程式碼
	只有在python上開程序用的多,其他語言一般不開多程序,只開多執行緒就夠了
	python有GIL鎖的原因,同一個程序下多個執行緒實際上同一時刻,只有一個執行緒在執行
	cpython直譯器不能利用多核優勢,只有開都程序才能利用多核優勢,其他語言不存在這個問題
    
    
# 執行緒是cpu執行的最小單位
	一個程序下可以開啟多個執行緒
	8核cpu電腦,充分利用起我這個8核,至少起8個執行緒,8條執行緒全是計算--->計算機cpu使用率是100%
	如果不存在GIL鎖,一個程序下,開啟8個執行緒,它就能夠充分利用cpu資源,跑滿cpu
	cpython直譯器中好多程式碼,模組都是基於GIL鎖機制寫起來的,改不了了---》我們不能有8個核,但我現在只能用1核,----》開啟多程序---》每個程序下開啟的執行緒,可以被多個cpu排程執行
	cpython直譯器:io密集型使用多執行緒,計算密集型使用多程序
	io密集型,遇到io操作會切換cpu,假設你開了8個執行緒,8個執行緒都有io操作---》io操作不消耗cpu---》一段時間內看上去,其實8個執行緒都執行了
	計算密集型,消耗cpu,如果開了8個執行緒,第一個執行緒會一直佔著cpu,而不會排程到其他執行緒執行,其他7個執行緒根本沒執行,所以我們開8個程序,每個程序有一個執行緒,8個程序下的執行緒會被8個cpu執行,從而效率高
	由於程序是資源分配的最小單位,起了一個程序,定義了變數,這個變數在多個執行緒下是共享的
    
	程序間通訊---IPC:程序間資料隔離,所以需要通訊---》Queue(程序queue)---》一般使用訊息佇列--》redis
	同一個程序下多執行緒資料是共享的
	多執行緒同時操作一個數據,資料錯亂,併發安全問題--->加鎖--》讓原本併發的操作,變成序列,犧牲效率,保證安全---》通過執行緒queue也可以避免併發安全的問題,所有queue的本質就是鎖
	互斥鎖 ---》效率高低 --》自旋鎖
	死鎖問題:a執行緒拿了a鎖,想要拿b鎖,b執行緒拿了b鎖,想拿a鎖
	遞迴鎖(可重入鎖):讓一把鎖可以重複被同一個執行緒拿到 a和b都是一個鎖,a可重入鎖
      
	多程序下的不同執行緒要通訊如何做
	等同於程序間通訊
    
# 協程是單執行緒下程式層面控制任務的切換實現併發
	本身cpu遇到io會切換到另一條執行緒執行---》執行緒間切換要儲存執行緒狀態,後來再切回來執行,要恢復狀態,作業系統層面操作,消耗資源
	程式設計師想:程式層面自己切換,task1(),task2(),當task1執行中遇到io操作,程式層面切換到task2中執行,作業系統只看到一條執行緒在執行,都在執行計算操作,作業系統層面就不會切,看到效果,一個時間段內,執行了很多工,但都是在同一條執行緒下執行的
	協程也只是針對io密集型的操作才效率高,如果純計算密集型,它就不切,效率就不高
	使用協程,遇到io就會切換---》task1(),task2(),當task1執行中遇到io操作,程式層面切換到task2中執行但是task2的io還沒結束,不停來回切換空耗cpu
  
  
# GIL:cpython直譯器好多都是基於GIL鎖機制寫起來的,改不了了
	全域性直譯器鎖:最早,都是單核cpu,python是解釋型語言,有垃圾回收機制---》開了多執行緒,多個執行緒引用了這個變數---》要做垃圾回收(垃圾回收執行緒)---》檢索引用計數是不是0,必須要保證在垃圾回收執行緒在執行的時候,其它執行緒不能執行的,才能順利做垃圾回收---》當時又是單核cpu,不存在多核的情況,最簡單的方法,搞一把大鎖,在同一個時刻,只要拿到gil鎖,執行緒才能執行---》隨著多核cpu的出現--->沒辦法了,作者寫了開啟多程序的方案來解決 cpu不能充分利用的問題

# 瞭解一下 go語言程式碼使用c呼叫
	https://zhuanlan.zhihu.com/p/355538331
  
# 有了GIL鎖,為什麼還要互斥鎖
	同一時刻只有一個執行緒在執行,還會出併發安全的問題嗎? 已經變成串行了,怎麼還會有併發安全問題?
	比如兩個執行緒要把a=a+1,a一開始等於0
	第一個執行緒取到了a,計算完了 a現在是1 ,還沒賦值回顧
	第二個執行緒取到了a,計算問了,a現在是1,執行緒切換回第一條執行緒,a變成了1
    
    
    
# 你用web框架寫東西,用過多執行緒或者多程序嗎?
	可能用celery使用過多程序
	如何保證專案的併發量?--》前面的web伺服器乾的---》wsgiref---》uwsgi使用c寫的,c開啟程序,執行緒,在c程序中執行django,執行python的程式碼
	uwsgi是程序+執行緒模型
	uwsgi+gevent 是程序+執行緒模型+協程模型

2、docker-compose一鍵部署演示

### 1 新的centos機器,安裝docker和docker-compost
# 安裝依賴
yum install -y yum-utils device-mapper-persistent-data lvm2

# 設定yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安裝docker
yum install -y docker-ce

# 設定開機啟動
systemctl enable docker

# 啟動 Docker
systemctl start docker

# 檢視版本
docker version

## 安裝docker-compose
# 下載
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.5.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 賦予執行許可權
chmod +x /usr/local/bin/docker-compose

# 檢視版本
docker-compose --version


### 2 下載程式碼並啟動
# 下載git
yum install git -y

# 下載程式碼
git clone https://gitee.com/deity-jgx/luffy.git
    
# 進入目錄
cd luffy

# 執行
docker-compose up
"""
https://gitee.com/liuqingzheng/luffy
        
### 修改 luffycity/src/assets/js/settings.js:
	export default {
    base_url: "http://139.224.254.58:8000(改為自己的伺服器公網IP  )/api/v1/"
}   

"""

### 3 匯入測試資料
# 把luffy下luffy_api下的luffy.sql匯入luffy庫

3、搭建代理池

# https://github.com/jhao104/proxy_pool
	python的爬蟲+flask寫的
	本質使用爬蟲技術爬取免費的代理,驗證--》requests模組驗證---》存到redis中
	起一個web伺服器,只要訪問一個地址,他就隨機給你一個ip地址
    
    
    
# 步驟:
	第一步:git clone [email protected]:jhao104/proxy_pool.git
            
	第二步:安裝依賴:pip install -r requirements.txt
    
	第三步: 修改程式碼,修改配置
	# setting.py 為專案配置檔案
	# 配置API服務
	HOST = "0.0.0.0"               # IP
	PORT = 5000                    # 監聽埠

	# 配置資料庫
	DB_CONN = 'redis://:[email protected]:8888/0'

	# 配置 ProxyFetcher
PROXY_FETCHER = [
      "freeProxy01",      # 這裡是啟用的代理抓取方法名,所有fetch方法位於fetcher/proxyFetcher.py
      "freeProxy02",
      # ....
  ]

  
	第四步:啟動爬蟲
	python3 proxyPool.py schedule
    
	第五步:啟動服務
	# 啟動webApi服務
	python proxyPool.py server
### 代理使用測試

import requests

# http://127.0.0.1:5010/get/
ip = "http://" + requests.get('http://139.155.237.73:5010/get/').json()['proxy']
print(ip)
proxies = {
    'http': ip,
}
res = requests.get('http://47.104.165.24:8001/check/', proxies=proxies)
print(res.text)

4、requests超時設定

import requests

# http://127.0.0.1:5010/get/
ip = "http://" + requests.get('http://139.155.237.73:5010/get/').json()['proxy']

print(ip)

proxies = {
    'http': ip,
}

res = requests.get('http://47.104.165.24:8001/check/', proxies=proxies, timeout=1)

print(res.text)

5、requests認證設定

# 這種很少見,極個別公司內部可能還用這種

import requests
from requests.auth import HTTPBasicAuth

r = requests.get('xxx', auth=HTTPBasicAuth('user', 'password'))
print(r.status_code)

# HTTPBasicAuth可以簡寫為如下格式
import requests

r = requests.get('xxx', auth=('user', 'password'))
print(r.status_code)

6、requests異常處理

from requests.exceptions import *  # 可以檢視requests.exceptions獲取異常型別

try:
    r = requests.get('http://www.baidu.com', timeout=0.00001)
except ReadTimeout:
    print('===:')
    
# except ConnectionError: #網路不通
#     print('-----')
# except Timeout:
#     print('aaaaa')

except Exception:
    print('Error')

7、requests上傳檔案

# 上傳檔案--》爬蟲一般不會用,但是咱們服務會用

import requests

files = {'file': open('a.jpg', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)

# 咱們django專案
	你們公司專案,使用了第三方服務,第三放服務提供了api介面,沒提供sdk
	就要使用request傳送請求,獲取資料

# 前端提交一個長鏈地址  www.cnblogs.com/liuqingzheng/p/233.html--->轉成短鏈--》x.com/asdf--->存到自己資料庫中

# 專門服務,處理長連轉短鏈(go,java)---》介面--》post,帶著地址---》返回json,短鏈地址