程序啟動多個程序 程序之間是由作業系統負責呼叫
執行緒 啟動多個執行緒 真正被cpu執行的最小單位實際是執行緒
開啟乙個執行緒 建立乙個執行緒 暫存器 堆疊
關閉乙個執行緒
協程本質上是乙個執行緒
能夠在多個任務之間切換來節省一些io時間
協程中任務之間的切換也消耗時間,但是開銷要遠遠小於程序執行緒之間的切換
importtime
defconsumer():
while
true:
x = yield
time.sleep(1)
print('
處理了資料 :
',x)
defproducer():
# 建立乙個生成器物件
c =consumer()
# 啟用這個生成器
next(c)
for i in range(10):
time.sleep(1)
print('
生產了資料 :
',i)
c.send(i)
producer()
真正的協程模組就是使用greenlet完成的切換from greenlet import
greenlet
defeat():
print('
eating start')
g2.switch()
print('
eating end')
g2.switch()
defplay():
print('
playing start')
g1.switch()
print('
playing end')
g1 =greenlet(eat)
g2 =greenlet(play)
g1.switch()
可以看出來,greenlet只能實現兩個**之間的切換,但是我們使用協程的主要原因是在io請求時,達到非阻塞的作用,所以我們需要使用gevent模組來讓**可以遇到阻塞就自由的切換
from gevent importmonkey;monkey.patch_all()
import
time
import
gevent
import
threading
defeat():
(threading.current_thread().getname())
(threading.current_thread())
print('
eating start')
time.sleep(1)
print('
eating end')
defplay():
(threading.current_thread().getname())
(threading.current_thread())
print('
playing start')
time.sleep(1)
print('
playing end')
g1 =gevent.spawn(eat)
g2 =gevent.spawn(play)
g1.join()
g2.join()
程序和執行緒的任務切換由作業系統完成協程任務之間的切換由程式(**)完成,只有遇到協程模組能識別的io操作的時候,程式才會進行任務切換,實現併發的效果
同步 和 非同步
from gevent import
monkey;monkey.patch_all()
import
time
import
gevent
deftask(n):
time.sleep(1)
(n)def
sync():
for i in range(10):
task(i)
defasync():
g_lst =
for i in range(10):
g =gevent.spawn(task,i)
gevent.joinall(g_lst)
#for g in g_lst:g.join()
sync()
async()
在高io的時候可以使用 例如爬蟲, 爬蟲需要請求很多url,使用協程可以讓請求同時發出,而不會因為在等待乙個url的請求響應而阻塞程式
不適用於高計算的環境, 因為在計算時cpu是一直工作的, 頻繁的切換執行的程式,會白白增加切換程式的時間,導致計算效率下降
Python反爬手段之User Agent池
user agent即使用者 簡稱ua,它是乙個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本 cpu型別 瀏覽器及版本 瀏覽器渲染引擎 瀏覽器語言 瀏覽器外掛程式等。一些 常常通過判斷ua來給不同的作業系統 不同的瀏覽器傳送不同的頁面,因此可能造成某些頁面無法在某個瀏覽器中正常顯示,但通過...
目前常用的高併發處理手段
最近看了很多高併發的解決方案,高併發並沒有通用的解決方案,也不會有現成的demo或者原始碼可以參考,我在這方面也沒有什麼經驗 但是從我看到很多深度不高的文章來說,可以總結出一些可以真正落地的解決辦法 1.入口流量分發,軟體硬體分發 常見的nginx 負載均衡,lvs虛擬ip流量分發,以及f5硬體負載...
HTML中的Hack手段之條件注釋
通常web的好處就是可以跨平台,但這個世界偏偏有個另類,就是ie瀏覽器。在平常做html設計時,有時需要為ie的表示差異而不得不使用一些hack手段。條件注釋就是這類手段之一。條件注釋是ie瀏覽器的 專利 也就是說我們在html中可以為ie嵌入一段專有標籤片段,來解決ie與其它瀏覽器的表現差異。條件...